python - 根据 pandas 中的 MULTIPLE 列中的值从 DataFrame 中选择行
问题描述
所以这个问题涉及如何根据数组(或单列)中的值选择数据框中的行子集。对我来说解决我的问题是不够的。
我在多个目录中有许多不同的表。我有一本包含表之间关系的字典(例如连接键)。对于每个表 T1,我查找共享相同列名(键)的其他表(T2、T3...),并且我想过滤这些表(T2、T3...)以包含具有匹配键值的行具有 T1 的列集。键组可能会有所不同!T1 可以在一列(键)上连接到 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))]
推荐阅读
- swift - 为什么我的 didUpdate userLocation 方法没有被调用?
- python - 如何仅使用 While 循环和条件按字母顺序排列字符串?
- winapi - 如果我将 wndproc 函数分配给 wndclass 则会发生错误
- reactjs - 为什么我在 React 中返回时需要一个额外的包装器?
- javascript - web worker - 传回主线程时数据未定义
- android - 如何使用 Kotlin Flow 从异步回调中发出数据?
- jwt - JWT 令牌嵌套在 B2C 令牌的“idp_access_token”声明中
- javascript - 为相同类型的每个组件反应唯一状态
- discord.js - 对 forEach 循环感到困惑
- javascript - 如何更改我的画布色轮,使其边缘像 CSS 版本一样平滑?