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

如何合并多个Pandas DataFrame?多测量数据合并需求求助

嘿,我完全懂你现在的困惑——之前试了好几种合并方法,结果要么行变多了,要么把位置和日期的行列搞反了,对吧?咱们一步步来实现你想要的宽表结构:

核心思路

咱们需要先把所有分散的测量数据整合成一个长表,再把它转成宽表(日期作为列),最后和存储位置信息的主表合并,就能得到你要的结果了。

具体步骤&代码示例

假设你已经把所有测量用的DataFrame(df2到dfn)放到了一个列表里,比如measurement_dfs = [df2, df3, ..., dfn],咱们开始:

  1. 合并所有测量数据到一个长表
    因为这些测量表的结构完全一致,用pd.concat把它们纵向合并就行:

    import pandas as pd
    
    # 合并所有测量DataFrame
    all_measurements = pd.concat(measurement_dfs, ignore_index=True)
    
  2. 把长表转成宽表(日期变列)
    这里用pivot_table来转换,它能稳妥地把Date从行转成列,同时以Location ID为分组依据,对应填充Measurement的值。如果同一个位置+日期有多个测量值,aggfunc='first'会取第一个,你也可以改成'mean'(取平均值)之类的:

    # 转换为宽表:Location ID作为行,日期作为列,值为测量数据
    measurements_wide = all_measurements.pivot_table(
        index='Location ID',
        columns='Date',
        values='Measurement',
        aggfunc='first'
    ).reset_index()  # 把Location ID从索引转回普通列,方便后续合并
    
    # (可选)如果想把日期列名转成你示例里的字符串格式(比如"January 1 12:30")
    measurements_wide.columns = ['Location ID'] + [col.strftime('%B %d %H:%M') for col in measurements_wide.columns[1:]]
    
  3. 和主位置表合并
    用pd.merge把宽表和df1合并,以Location ID为匹配键,用how='left'保证所有位置信息都被保留,没有测量数据的日期会自动填充NaN:

    df_final = pd.merge(
        df1,
        measurements_wide,
        on='Location ID',
        how='left'
    )
    

为什么之前的方法没成功?

  • append/pd.concat默认是纵向合并行,所以会把所有测量行都加进来,导致行数暴增;
  • 直接用merge不先转宽的话,会把每个测量条目都和位置表匹配,同样会产生重复行;
  • 如果错误地用了转置,就会把Location ID变成列、日期变成行,和你要的结构完全相反。

这样操作之后,你就能得到和示例里一模一样的df_final啦!

内容的提问来源于stack exchange,提问作者Michiel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:57:54