使用pandas根据DATA FRAME中的多列值选择行

2024-04-19 18:22:06 发布

您现在位置:Python中文网/ 问答频道 /正文

因此this question关注如何基于数组(或单个列)中的值来选择数据帧中的行子集。对我来说解决问题是不够的

我在多个目录中有许多不同的表。我有一本字典,里面有表之间的关系(例如join键)。对于每个表T1,我查找共享相同列名(键)的其他表(T2,T3…),并对这些表(T2,T3…)进行筛选,以包含在一组列中具有匹配键值的行。密钥集可能会有所不同!T1可以在一列(键)上连接到T2,而T1可以在5个键上连接到T2!我事先不知道这件事

例如我有t1, t2, t3pks=["id"] (t1-->t2), fks=["id", "index", "zip"] (t1-->t3)

t1
id|index|zip|v
10|10000|200|20

t2
id|v
10|30
20|50
30|70

t3
id|index|zip|v
00|10000|200|10
10|10000|200|20
10|10000|300|30
10|10000|200|10

t2和t3的输出为

t2
id|v
10|30

以及 t3级

id|index|zip|v
10|10000|200|20
10|10000|200|10

看前面的答案,我可能需要做smth喜欢

filtered_t2 = t2.loc[t2[pks].isin(t1[fks])]

但我得到以下错误

ValueError: Cannot index with multidimensional key

可能这样我无法处理复合键,但如果我只提供一个键--“id”,它也会失败! 所以它可能不能接受数组作为值

pksfks是大小可变的数组时,如何处理它

这是正确的方法吗:

    filter = None
    for p, f in zip(pks, fks):
        if filter is None:
            filter = t2[p].isin(t1[f])
        else:
            filter &= t2[p].isin(t1[f])

    filtered_ft = t2.loc[filter]

谢谢


Tags: idindex数组zipfilterfilteredt1t3
1条回答
网友
1楼 · 发布于 2024-04-19 18:22:06

让我们在这里试试merge

t2.merge(t1,how='inner',on=['id'])

t3.merge(t1,how='inner',on=['id','index','zip'])

换一种方式

t2[t2[pks].apply(tuple,1).isin(t1[pks].apply(tuple,1))]

相关问题 更多 >