如何在Python中基于两个关联数据集的条件创建第三个数据集?
解决基于两个关联DataFrame筛选数据的问题
看起来你是想从df里挑出那些在fp中FP字段为'fp'的对应行,只保留ID、P1、P2这三列对吧?你之前用np.where的写法确实有问题,咱们来一步步解决这个问题。
首先先明确你的原始数据:
import pandas as pd df = pd.DataFrame(columns=['ID','P1','P2'], data=[[1, 2, 0], [2,1,0], [3, 1, 2], [4, 2, 1], [5, 1, 2], [6, 0, 1], [7, 1, 0]]) fp = pd.DataFrame(columns=['ID','FP'], data=[[1, 'fp'], [2,'i'], [3, 'i'], [4, 'fp'], [5, 'fp'], [6, 'fp'], [7, 'i']])
方法1:合并DataFrame后筛选
这是最直观的方式,先把两个表按ID关联起来,再筛选出FP为'fp'的行,最后保留你需要的列:
# 按ID合并两个表 merged_data = pd.merge(df, fp, on='ID') # 筛选FP为'fp'的行,只保留指定列 df2 = merged_data[merged_data['FP'] == 'fp'][['ID', 'P1', 'P2']]
方法2:先提取符合条件的ID再筛选
如果你的数据量比较大,这种方法效率会更高——先从fp里把FP为'fp'的ID提取出来,再用这个ID列表去df里过滤:
# 提取所有FP为'fp'的ID target_ids = fp[fp['FP'] == 'fp']['ID'].tolist() # 在df中筛选ID在目标列表里的行 df2 = df[df['ID'].isin(target_ids)]
为什么你之前的代码不行?
你写的np.where((df['ID']==fp['ID'])&fp['FP']=='fp')有两个问题:
- 语法错误:你少了一个闭合的括号,正确的语法应该是
np.where((df['ID']==fp['ID']) & (fp['FP']=='fp')) - 逻辑问题:
np.where在这里不适合做关联筛选——如果两个DataFrame的行顺序不一致,df['ID']==fp['ID']的逐行比较会完全出错;而且np.where返回的是满足条件的索引位置,不是直接生成你需要的DataFrame。
用上面两种方法都能得到你想要的结果,运行后df2的输出应该是:
ID P1 P2 0 1 2 0 1 4 2 1 2 5 1 2 3 6 0 1
内容的提问来源于stack exchange,提问作者Song Mei
相关产品推荐
相关产品推荐

