首页 > 解决方案 > 根据 pandas 中的 MULTIPLE 列中的值从 DataFrame 中选择行

问题描述

所以这个问题涉及如何根据数组(或单列)中的值选择数据框中的行子集。对我来说解决我的问题是不够的。

我在多个目录中有许多不同的表。我有一本包含表之间关系的字典(例如连接键)。对于每个表 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',它也会失败!所以也许它不能接受一个数组作为值......

当数组是可变大小的数组时pks,我该如何处理?fks

这将是一个正确的方法:

    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]

谢谢!

标签: pythonpandasdataframe

解决方案


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))]

推荐阅读