Pandas:基于特定列的值计数选择行

18

如何从Pandas数据框中选择所有符号在整个表格中恰好出现两次的行?例如,在下面的表格中,我想选择所有符号为['b','e']的行,因为这些符号的value_counts等于2。

df=pd.DataFrame({'sym':['a', 'b', 'b', 'c', 'd','d','d','e','e'],'price':np.random.randn(9)})

                     price sym
    0              -0.0129   a
    1              -1.2940   b
    2               1.8423   b
    3              -0.7160   c
    4              -2.3216   d
    5              -0.0120   d
    6              -0.5914   d
    7               0.6280   e
    8               0.5361   e

df.sym.value_counts()
Out[237]: 
d    3
e    2
b    2
c    1
a    1
2个回答

45

我认为你可以使用按列sym groupby,并使用 filter 过滤值为length == 2的数据:

print df.groupby("sym").filter(lambda x: len(x) == 2)
      price sym
1  0.400157   b
2  0.978738   b
7 -0.151357   e
8 -0.103219   e

第二种解决方法是使用isin函数和布尔索引:

s = df.sym.value_counts()

print s[s == 2].index
Index([u'e', u'b'], dtype='object')

print df[df.sym.isin(s[s == 2].index)]
      price sym
1  0.400157   b
2  0.978738   b
7 -0.151357   e
8 -0.103219   e

使用transformboolean indexing的最快解决方案:

print (df[df.groupby("sym")["sym"].transform('size') == 2])
    price sym
1 -1.2940   b
2  1.8423   b
7  0.6280   e
8  0.5361   e

17
你可以使用map,这比使用groupbytransform更快:
df[df['sym'].map(df['sym'].value_counts()) == 2]

例如

%%timeit
df[df['sym'].map(df['sym'].value_counts()) == 2]
Out[1]:
1.83 ms ± 23.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
df[df.groupby("sym")["sym"].transform('size') == 2]
Out[2]:
2.08 ms ± 41.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

1
对于我正在处理的问题,这个答案快了15倍。 - Roozbeh Bakhshi
你如何处理多个条件?例如,对于 'sym' ==2 & 4。 - Yoseph Ismail
原始答案可能是正确的,但如果你正在处理大量数据,那么它可能需要很长时间。使用这个答案可以节省时间。 - jimmy

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