如何将DataFrame中相同站点ID和日期的物质值合并到单行?
合并同站点同日期的物质值到单行的实现方法
根据你的需求(将相同站点ID、日期的不同物质数值合并到同一行),以下是具体实现方案,同时解答你提到的几个方法的适用性:
1. 最简便的方案:用pivot方法
这是处理这类行列转换需求的标准方法,直接将「物质」列的取值转为新列名,对应填充数值:
import pandas as pd # 假设你的原始DataFrame名为df result_df = df.pivot( index=['站点ID', '日期'], # 作为行标识的列 columns='物质', # 要转成新列的列 values='数值' # 填充新列的数值来源 ).reset_index() # 可选:清理列名格式,让结果更直观 result_df.columns.name = None # 移除列索引的名称 result_df = result_df.rename(columns={"PM2.5": "PM2.5数值", "PM10": "PM10数值"})
2. 用groupby + aggregate实现
如果需要自定义聚合逻辑(比如处理重复值),可以用分组聚合:
result_df = df.groupby(['站点ID', '日期']).agg( PM2.5=('数值', lambda x: x[df.loc[x.index, '物质'] == 'PM2.5'].iloc[0]), PM10=('数值', lambda x: x[df.loc[x.index, '物质'] == 'PM10'].iloc[0]) ).reset_index()
注:如果同站点同日期下同一物质有多个值,这里的iloc[0]可以换成你需要的聚合方式(比如mean取平均值)。
3. 关于match和merge的适用性
match:这个方法主要用于匹配序列的位置索引,完全不适合你的需求,没必要使用。merge:可以实现但步骤繁琐,需要先拆分不同物质的子DataFrame再逐一合并,仅适合物质类型极少的场景,示例如下:
# 拆分出各物质的DataFrame并重命名列 pm25_df = df[df['物质'] == 'PM2.5'].rename(columns={'数值': 'PM2.5'}).drop('物质', axis=1) pm10_df = df[df['物质'] == 'PM10'].rename(columns={'数值': 'PM10'}).drop('物质', axis=1) # 按站点ID和日期合并 result_df = pd.merge(pm25_df, pm10_df, on=['站点ID', '日期'], how='outer')
内容的提问来源于stack exchange,提问作者AUS85
相关产品推荐
相关产品推荐

