使用glob与concat合并CSV时,如何排除Rain列无数据的文件?
自动筛选有效站点数据并合并CSV文件
问题背景
我拥有近2000个站点2022年5-8月的逐小时气温与降雨观测数据,每个站点对应一个CSV文件。已将逐小时数据处理为日均值,保存为StationName - edited.csv格式,处理后的数据样例如下:
df.head() Out[5]: date station lat lon Rain Temp 0 2022-05-01 72750494999 46.5475 -93.67667 100.0 109.4 1 2022-05-02 72750494999 46.5475 -93.67667 93.0 96.8 2 2022-05-03 72750494999 46.5475 -93.67667 93.0 96.8 3 2022-05-04 72750494999 46.5475 -93.67667 100.0 96.8 4 2022-05-05 72750494999 46.5475 -93.67667 87.0 98.6
需要将所有CSV合并为单个文件,但其中约150个文件的Rain列无有效观测数据,手动查找效率极低。要求在合并流程中自动排除这类文件,仅保留同时包含有效Rain和Temp列数据的文件。现有合并代码如下:
import numpy as np import pandas as pd # Read all the csv if Folder import glob filenames = sorted(glob.glob('*.csv')) # Create an empty dataset e = pd.DataFrame() for f in filenames: # read the variables df = pd.read_csv(f, index_col=None) # I think I should add something here! e = pd.concat([e, df], axis=0)
解决方案
在读取每个CSV文件后,添加条件判断:检查Rain列是否存在至少一个有效非空值,同时Temp列也存在至少一个有效非空值。只有满足条件的文件才会被合并到最终数据集里。
修改后的完整代码:
import numpy as np import pandas as pd import glob filenames = sorted(glob.glob('*.csv')) merged_df = pd.DataFrame() for f in filenames: df = pd.read_csv(f, index_col=None) # 检查Rain和Temp列是否有至少一个有效非空数据 has_valid_rain = df['Rain'].notna().any() has_valid_temp = df['Temp'].notna().any() if has_valid_rain and has_valid_temp: merged_df = pd.concat([merged_df, df], axis=0) else: # 可选:打印被排除的文件名,方便后续核查 print(f"排除无有效数据的文件: {f}") # 保存合并后的文件 merged_df.to_csv('merged_station_data.csv', index=False)
关键逻辑说明
df['Rain'].notna().any():判断Rain列是否存在至少一个非空的有效数据(如果无观测数据表现为全NaN,此判断会返回False)。df['Temp'].notna().any():同理判断Temp列是否有有效数据。- 只有当两个条件同时满足时,才将当前文件的数据合并到总数据集中;否则跳过该文件,还可以选择打印被排除的文件名用于后续核对。
内容的提问来源于stack exchange,提问作者babak asadolah
相关产品推荐
相关产品推荐

