You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:20:06