如何用pd.concat合并值不同的两个DataFrame?求更优方案
合并两个DataFrame实现指定格式的方案
嘿,我来帮你搞定这个DataFrame合并的需求!先明确下我们的输入和目标:
输入的两个DataFrame
第一个DataFrame(df):
import pandas as pd id = [30, 30] month = [1, 3] less_data = ['pravin', 'shashi'] df = pd.DataFrame(list(zip(id, month, less_data)), columns=['id', 'month', 'less_data'])
第二个DataFrame(df2):
id = [30, 30] month = [1, 2] less_data = ['amol', 'pinak'] df2 = pd.DataFrame(list(zip(id, month, less_data)), columns=['id', 'month', 'zero_data'])
我们要得到的目标输出是:
id month less_data zero_data 30 1 pravin amol 30 2 pinak 30 3 shashi
解决方案
方案一:用pd.merge(更简洁高效的首选)
这是最贴合需求的方法,直接基于id和month做外连接(outer join),它会自动保留所有出现过的id+month组合,把对应列的数据匹配好,缺失的位置默认显示NaN,如果要改成空字符串只需要补一步填充:
# 执行外连接合并 result = pd.merge(df, df2, on=['id', 'month'], how='outer') # 把NaN替换为空字符串(可选,根据需求决定) result = result.fillna('')
运行后就能得到你想要的结果,这个方法步骤少、效率高,是最优解。
方案二:用pd.concat实现
如果一定要用pd.concat来做,需要先对齐两个DataFrame的列,合并后再分组聚合取非空值:
# 先让两个df的列保持一致,补全缺失的列 df = df.reindex(columns=['id', 'month', 'less_data', 'zero_data']) df2 = df2.reindex(columns=['id', 'month', 'less_data', 'zero_data']) # 合并两个DataFrame combined = pd.concat([df, df2]) # 按id和month分组,取每个组内的第一个非空值,最后替换空值 result = combined.groupby(['id', 'month'], as_index=False).first().fillna('')
这个方法也能达到目标,但步骤比merge多,所以优先推荐merge方案。
内容的提问来源于stack exchange,提问作者Amol




