如何基于index.name交集两个Pandas DataFrame?尝试未成功
解决DataFrame基于共享ID的交集问题
嘿,我来帮你搞定这个DataFrame交集的问题!你说的共享ID由index.name指定,我先分两种常见场景给你对应的解决方案,你可以对照自己的情况选:
场景1:两个DataFrame的索引就是共享ID(索引的name是这个ID的标识)
比如dfA和dfB的索引都是名为user_id的ID列,这时候要取两个DF中索引重合的行生成dfC,有两种简单方法:
方法1:用join直接做内连接
这是最简洁的方式,直接保留索引相同的行并合并列:
import pandas as pd dfC = dfA.join(dfB, how='inner')
方法2:先提取索引交集再筛选
如果你只想保留其中一个DF的列(比如只留dfA的内容),可以先拿到共同ID再筛选:
# 获取两个索引的交集 common_ids = dfA.index.intersection(dfB.index) # 筛选dfA中属于交集的行 dfC = dfA.loc[common_ids] # 如果需要同时保留dfB的列,就把两个DF都筛选后合并 dfC = pd.concat([dfA.loc[common_ids], dfB.loc[common_ids]], axis=1)
场景2:共享ID是名为index.name的普通列
比如dfA.index.name是product_id,意味着两个DF都有一列叫product_id的共享ID,这时候用merge更合适:
方法1:内连接合并两个DF
id_col = dfA.index.name # how='inner'就是取交集,只保留两边都存在的ID对应的行 dfC = pd.merge(dfA, dfB, on=id_col, how='inner')
方法2:筛选其中一个DF的交集行
如果只需要保留dfA中在dfB里存在的ID行:
id_col = dfA.index.name # 先判断dfA的ID是否在dfB中存在 mask = dfA[id_col].isin(dfB[id_col]) dfC = dfA[mask]
额外提醒:处理重复ID
如果你的DF里有重复的ID,建议先去重再做交集,避免结果出现重复行:
# 针对索引是ID的情况去重 dfA = dfA[~dfA.index.duplicated()] dfB = dfB[~dfB.index.duplicated()] # 针对普通ID列的情况去重 dfA = dfA.drop_duplicates(subset=id_col) dfB = dfB.drop_duplicates(subset=id_col)
内容的提问来源于stack exchange,提问作者andandandand
相关产品推荐
相关产品推荐

