按照具有多个相似值的行对 Pandas 数据框进行排序。

3
我试图按包含任意两个特定值的行对 Pandas 数据帧进行排序。在下面的示例数据中,我想选择具有“apple”和“grape”的值的行。
  a     b      c
0 apple orange grape
1 grape apple  banana
2 pear  kiwi   apple

导致过滤后的数据帧呈现:
  a     b      c
0 apple orange grape
1 grape apple  banana

使用以下代码,我可以选择所有具有特定值的行:
df[(df == 'orange').any(axis=1)]

预期的结果已返回:

  a     b      c
0 apple orange grape

使用以下代码行,我原本期望选择包含这两个值的行,但是实际返回了所有包含apple或grape作为列值的行:
df[np.isin(df, ['apple', 'grape']).any(axis=1)]

我原本希望通过先前的代码仅获取拥有苹果和葡萄的行,但显然这并不是正确的实现方式。如何选择只拥有任意一列中同时含有两个值的行?

3个回答

4

另一种方法是创建布尔掩码(boolean mask):

mask=df.isin(['apple','grape']).sum(1).eq(2)

最后:

result=df[mask]
< p > result 的输出:

    a       b       c
0   apple   orange  grape
1   grape   apple   banana

3

根据您展示的样本和布尔蒙版,请尝试以下操作。使用Pandas的.any函数。

m1 = (df=='apple').any(1)
m2 = (df=='grape').any(1)
df[m1 & m2]

输出结果如下:
    a       b       c
0   apple   orange  grape
1   grape   apple   banana

2
一种选项是使用 np.isin 在 axis=1 上“计算” True 的数量,然后使用 sum 进行比较,看它是否大于等于正在检查的值的数量:
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'a': {0: 'apple', 1: 'grape', 2: 'pear'},
    'b': {0: 'orange', 1: 'apple', 2: 'kiwi'},
    'c': {0: 'grape', 1: 'banana', 2: 'apple'}
})

vals = ['apple', 'grape']

filtered = df[np.isin(df, vals).sum(axis=1) >= len(vals)]

print(filtered)

另一个选项是将这些数值转换为集合,并在轴axis=1上应用apply issubset
filtered = df[df.apply(set(vals).issubset, axis=1)]

双方都给予:
       a       b       c
0  apple  orange   grape
1  grape   apple  banana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接