pandas dataframe删除低频行

时间:2018-03-06 17:49:26

标签: python pandas dataframe

删除具有低频率列的所有行的最佳做法是什么?

数据帧:

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: 在列'栏':

中删除频率值小于3的所有行
OUT:
foo bar poo
1   a   A
2   a   A
3   a   B
4   b   B
5   b   A
6   b   A

2 个答案:

答案 0 :(得分:4)

IIUC过滤器..

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 :(得分:3)

这应该很容易概括。您需要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