如何合并多个Pandas DataFrame,整合同名行的分散列数据并去重?
问题描述
现有一个包含多个Pandas DataFrame的列表,需要将它们合并为一个DataFrame,把同一name对应的分散列数据(如height、weight)整合到同一行。
示例输入列表:
import pandas as pd list_of_frames = [ pd.DataFrame({'name':'adam', 'height':'180'}, index=[0]), pd.DataFrame({'name':'adam', 'weight':'80'}, index=[1]), pd.DataFrame({'name':'eve', 'height':'190'}, index=[2]) ]
期望得到的目标DataFrame:
name height weight 0 adam 180 80 1 eve 190 NaN
尝试用pd.concat()得到了多行分散的结果,用reduce结合pd.merge()又出现带后缀的重复列,求正确实现方法。
解决方案
方法一:拼接后分组聚合(最稳妥)
先把所有小DataFrame拼接成一个大表,再按name分组,取每个分组里每列的第一个非空值就行——因为同一name下的同一列只会有一个有效值,剩下的都是空值。
import pandas as pd # 拼接所有DataFrame,忽略原索引 combined = pd.concat(list_of_frames, ignore_index=True) # 按name分组,聚合取非空值 result = combined.groupby('name', as_index=False).first()
运行后就能得到目标结果,用max()或者last()替代first()也可以,效果一致。
方法二:修正reduce+merge的用法
之前出现重复列是因为没明确合并规则,只要指定按name做外连接,并且不让merge自动加后缀,就能避免问题:
import pandas as pd from functools import reduce # 自定义合并函数,按name外连接,不添加后缀 def merge_dfs(df1, df2): return pd.merge(df1, df2, on='name', how='outer', suffixes=('', '')) # 用reduce批量合并所有DataFrame result = reduce(merge_dfs, list_of_frames) # 最后再按name去重取非空值(防止极端情况出现重复列) result = result.groupby('name', as_index=False).first()
内容的提问来源于stack exchange,提问作者Firefighting Physicist
相关产品推荐
相关产品推荐

