Pandas数据框删除低频行

5

如何最佳实践删除所有具有低频值列的行?

数据框:

IN:
foo bar poo
1   a   A
2   a   A
3   a   B
4   b   B
5   b   A
6   b   A
7   c   C
8   d   B
9   e   B

示例1:删除所有在“poo”列频率值小于3的行:

OUT:
foo bar poo
1   a   A
2   a   A
3   a   B
4   b   B
5   b   A
6   b   A
8   d   B
9   e   B

例子2:删除所有'bar'列中频率值小于3的行:

OUT:
foo bar poo
1   a   A
2   a   A
3   a   B
4   b   B
5   b   A
6   b   A
2个回答

12

这应该很容易推广。你需要使用groupby + transform + count,然后过滤结果:

col = 'poo'  # 'bar'
n = 3        # 2

df[df.groupby(col)[col].transform('count').ge(n)]

   foo bar poo
0    1   a   A
1    2   a   A
2    3   a   B
3    4   b   B
4    5   b   A
5    6   b   A
7    8   d   B
8    9   e   B

谢谢!我不明白为什么这个比你之前建议的要快那么多,之前需要一分钟以上,而这个瞬间就完成了! - AnonX
@AnonX 我们上次问答交流中得出的一个有趣结论是,对于系列数据(df.eq(..)生成系列数据),groupby 的速度会变得非常慢。非常有趣。 - cs95

5

IIUC filter ..

df.groupby('poo').filter(lambda x : (x['poo'].count()>=3).any())
Out[81]: 
   foo bar poo
0    1   a   A
1    2   a   A
2    3   a   B
3    4   b   B
4    5   b   A
5    6   b   A
7    8   d   B
8    9   e   B

你可以使用value_countsisin结合使用。

s=df.poo.value_counts().gt(3)
df.loc[df.poo.isin(s[s].index)]
Out[89]: 
   foo bar poo
0    1   a   A
1    2   a   A
2    3   a   B
3    4   b   B
4    5   b   A
5    6   b   A
7    8   d   B
8    9   e   B

1
第二个选项 = 快得多。谢谢! :) - AnonX

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