因此,这个问题关注如何根据数组(或单个列)中的值对数据帧中的行子集进行select。我解决问题还不够。
我在多个目录中有许多不同的表。我有一个表格之间的关系字典(例如加入的键)。对于每个表T1,我查找共享相同列名(keys)的其他表(T2,T3 ...),我想过滤这些表(T2,T3 ...)以包含一组中具有匹配键值的行T1的列。钥匙套可能有所不同! T1可以连接到一列(key)上的T2,而T1可以连接到5键上的T2!我事先不知道。
例如,我有t1, t2, t3
和pks=["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]
谢谢!
分析解答
我们在这里尝试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))]