选择与熊猫多列中的值匹配的行

尤汉·罗斯

如何选择与多列中的值匹配的行?

例如,我们有以下df

k1 | k2 | v1 | v2
1  | 2  | 3  | 4
1  | 5  | 5  | 6
1  | 8  | 8  | 9

我正在尝试选择中间行:

key_names = ["k1", "k2"]
keys = [1, 5]
selected_rows = df.loc[df[key_names].isin(keys)]

我收到以下错误:

ValueError: Cannot index with multidimensional key

预期的输出是:

1  | 5  | 5  | 6

谢谢

用户名

TLDR

根据您的要求使用以下之一:

df[(df[key_names] == keys).all(1)]

df[df[key_names].isin(keys).all(1)]

您已经很接近了,您已经成功创建了蒙版,只需要将其缩小为一个维度以进行索引。

>>> df[key_names].isin(keys)
     k1     k2
0  True  False
1  True   True
2  True  False

您只对所有值均为的行感兴趣True,因此可以all在第一个轴上使用来减小尺寸

>>> df[key_names].isin(keys).all(1)
0    False
1     True
2    False
dtype: bool

这里需要注意的一点是,isin它与顺序无关,因此使用另一种值排序方式,您将获得相同的结果。

>>> df[key_names].isin([5, 1]).all(1)
0    False
1     True
2    False
dtype: bool

如果您只需要精确的排序匹配,请使用==广播比较,而不是isin

>>> (df[key_names] == keys).all(1)
0    False
1     True
2    False
dtype: bool

>>> (df[key_names] == [5, 1]).all(1)
0    False
1    False
2    False
dtype: bool

这里的最后一步是使用1D您创建掩码为原始DataFrame编制索引:

>>> df[(df[key_names] == keys).all(1)]
   k1  k2  v1  v2
1   1   5   5   6

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章