如何为拼接后的Pandas DataFrame添加多来源标识列?
解决多DataFrame拼接后的多来源标识问题
我来帮你搞定这个问题!核心思路是先给每个小DataFrame打上专属标识,再通过分组合并的方式保留重复行的多来源标记,具体步骤如下:
1. 给每个小DataFrame添加专属标识列
首先,为每个小型DataFrame单独设置标识列:对应自身来源的列设为1,其余标识列设为0。这样拼接后,重复行的对应标识列会出现多个1,后续我们只需要合并这些值即可。
举个示例,假设你有4个小DataFrame:
import pandas as pd # 创建示例数据(你可以替换成自己的真实数据) df1 = pd.DataFrame({'Forename': ['charlie'], 'Surname': ['jim']}) df2 = pd.DataFrame({'Forename': ['ian'], 'Surname': ['james']}) df3 = pd.DataFrame({'Forename': [], 'Surname': []}) # 假设df3暂时无数据 df4 = pd.DataFrame({'Forename': ['jon', 'charlie'], 'Surname': ['smith', 'jim']})
给每个DataFrame批量添加标识列:
# 定义所有标识列名称 ind_cols = ['Ind_1', 'Ind_2', 'Ind_3', 'Ind_4'] # 循环给每个小DataFrame打标识 for idx, df in enumerate([df1, df2, df3, df4]): # 先把所有标识列初始化为0 df[ind_cols] = 0 # 当前DataFrame对应的标识列设为1 df[ind_cols[idx]] = 1
2. 拼接所有DataFrame
用pd.concat把打了标识的小DataFrame拼接到一起:
combined_df = pd.concat([df1, df2, df3, df4], ignore_index=True)
此时拼接后的结果里,重复行(比如charlie jim)会出现两次,分别带有Ind_1=1和Ind_4=1的标记。
3. 合并重复行并保留多来源标识
按姓名(Forename+Surname)分组,对每个标识列取最大值——这样就能把同一行在多个DataFrame里的标识都保留为1:
final_df = combined_df.groupby(['Forename', 'Surname'], as_index=False).max()
最终结果
运行上述代码后,你会得到完全符合预期的DataFrame:
Forename Surname Ind_1 Ind_2 Ind_3 Ind_4 0 charlie jim 1 0 0 1 1 ian james 0 1 0 0 2 jon smith 0 0 0 1
这个方法既解决了单一来源行的标记问题,也完美处理了重复行的多来源标记,而且如果后续新增小DataFrame,只需要扩展ind_cols和循环列表即可,非常灵活。
内容的提问来源于stack exchange,提问作者Joseph0210
相关产品推荐
相关产品推荐

