Python Pandas:基于两DataFrame的frame列求帧值交集并删无关行
获取两个DataFrame基于frame列的行交集(非连接)
嘿,我明白你要的是什么——不是把两个表合并成一个,而是分别从两名参与者的DataFrame里,只保留那些双方都成功跟踪到的帧(也就是frame列整数值完全相同的行)对吧?之前那个连接操作的答案确实没贴合需求,这里给你两个精准实现的方法:
方法1:先提取共同帧,再筛选(清晰直观)
先拿到两个DataFrame中frame列的共同值集合,再分别对两个原表做筛选,保留对应行:
import pandas as pd # 构造示例数据(模拟跟踪失败导致的帧缺失) df1 = pd.DataFrame({ 'frame': [1, 2, 3, 5, 7], 'participant1_data': [10, 20, 30, 50, 70] }) df2 = pd.DataFrame({ 'frame': [2, 3, 4, 6, 7], 'participant2_data': [200, 300, 400, 600, 700] }) # 第一步:获取两个frame列的交集 common_frames = df1['frame'].intersection(df2['frame']) # 第二步:分别筛选两个DataFrame,只保留共同帧的行 df1_filtered = df1[df1['frame'].isin(common_frames)] df2_filtered = df2[df2['frame'].isin(common_frames)]
执行后,df1_filtered会保留frame为2、3、7的行,df2_filtered同样保留这些帧的行,完全保留了各自原表的结构,只筛选出共同存在的帧数据。
方法2:直接用isin()交叉筛选(简洁高效)
如果不需要单独保存共同帧的集合,也可以直接一步完成筛选,省掉中间变量:
# 直接筛选df1中存在于df2的frame行 df1_filtered = df1[df1['frame'].isin(df2['frame'])] # 直接筛选df2中存在于df1的frame行 df2_filtered = df2[df2['frame'].isin(df1['frame'])]
这个方法和上面的结果完全一致,代码更短,适合快速实现。
为什么连接操作不符合需求?
之前的采纳答案用了merge类的连接操作,会把两个DataFrame的列合并到同一个表里,变成类似frame | participant1_data | participant2_data的结构,但你要的是两个独立的DataFrame,各自只保留共同帧的行,这才是真正意义上基于frame列的“交集”筛选。
内容的提问来源于stack exchange,提问作者NumesSanguis
相关产品推荐
相关产品推荐

