You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何用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(更简洁高效的首选)

这是最贴合需求的方法,直接基于idmonth外连接(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

火山引擎 最新活动