繁体   English   中英

根据熊猫中MULTIPLE列中的值从DataFrame中选择行

[英]Select rows from a DataFrame based on values in a MULTIPLE columns in pandas

因此, 这个问题涉及如何根据数组(或单个列)中的值选择数据框中的行子集。 我不足以解决我的问题。

我在多个目录中有许多不同的表。 我有一本字典,其中包含表之间的关系(例如,用于联接的键)。 对于每个表T1,我查找共享相同列名(键)的其他表(T2,T3 ...),并且要过滤这些表(T2,T3 ...),以在表中包含具有匹配键值的行。 T1列集。 按键设置可能有所不同! 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

看前面的答案,我可能需要做一些

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]

谢谢!

让我们尝试在这里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))]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM