如何合并多个Pandas DataFrame?多测量数据合并需求求助
嘿,我完全懂你现在的困惑——之前试了好几种合并方法,结果要么行变多了,要么把位置和日期的行列搞反了,对吧?咱们一步步来实现你想要的宽表结构:
核心思路
咱们需要先把所有分散的测量数据整合成一个长表,再把它转成宽表(日期作为列),最后和存储位置信息的主表合并,就能得到你要的结果了。
具体步骤&代码示例
假设你已经把所有测量用的DataFrame(df2到dfn)放到了一个列表里,比如measurement_dfs = [df2, df3, ..., dfn],咱们开始:
合并所有测量数据到一个长表
因为这些测量表的结构完全一致,用pd.concat把它们纵向合并就行:import pandas as pd # 合并所有测量DataFrame all_measurements = pd.concat(measurement_dfs, ignore_index=True)把长表转成宽表(日期变列)
这里用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:]]和主位置表合并
用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
相关产品推荐
相关产品推荐

