如何删除值频率小于 5 的行?蟒蛇,熊猫

aid*_*att 4 python pandas

我有一个包含很多行的数据框。有时,价值观是其中之一,对我的目的不是很有用。

如何从第 2 列和第 3 列的值出现不超过 5 次的地方删除所有行?

df 输入

 Col1     Col2     Col3       Col4
 1        apple    tomato     banana
 1        apple    potato     banana
 1        apple    tomato     banana
 1        apple    tomato     banana
 1        apple    tomato     banana
 1        apple    tomato     banana
 1        grape    tomato     banana
 1        pear     tomato     banana
 1        lemon    tomato     banana
Run Code Online (Sandbox Code Playgroud)

输出

 Col1     Col2     Col3       Col4
 1        apple    tomato     banana
 1        apple    tomato     banana
 1        apple    tomato     banana
 1        apple    tomato     banana
 1        apple    tomato     banana
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 6

全局计数
使用stack+ value_counts+ replace-

v = df[['Col2', 'Col3']]
df[v.replace(v.stack().value_counts()).gt(5).all(1)]

   Col1   Col2    Col3    Col4
0     1  apple  tomato  banana
2     1  apple  tomato  banana
3     1  apple  tomato  banana
4     1  apple  tomato  banana
5     1  apple  tomato  banana
Run Code Online (Sandbox Code Playgroud)

(更新)按
列计数

调用applypd.Series.value_counts以前一样对你的兴趣,过滤器以相同的方式列-

v = df[['Col2', 'Col3']]
df[v.replace(v.apply(pd.Series.value_counts)).gt(5).all(1)]

   Col1   Col2    Col3    Col4
0     1  apple  tomato  banana
2     1  apple  tomato  banana
3     1  apple  tomato  banana
4     1  apple  tomato  banana
5     1  apple  tomato  banana
Run Code Online (Sandbox Code Playgroud)

详细
使用value_counts来算在你的数据帧值-

c = v.apply(pd.Series.value_counts)
c

        Col2  Col3
apple    6.0   NaN
grape    1.0   NaN
lemon    1.0   NaN
pear     1.0   NaN
potato   NaN   1.0
tomato   NaN   8.0
Run Code Online (Sandbox Code Playgroud)

调用replace, 用它们的计数替换 DataFrame 中的值 -

i = v.replace(c)
i

   Col2  Col3
0     6     8
1     6     1
2     6     8
3     6     8
4     6     8
5     6     8
6     1     8
7     1     8
8     1     8
Run Code Online (Sandbox Code Playgroud)

从那时起,

m = i.gt(5).all(1)

0     True
1    False
2     True
3     True
4     True
5     True
6    False
7    False
8    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

使用掩码来索引df.


Ale*_*mov 5

转换的简单方法

counts_col2 = df.groupby("Col2")["Col2"].transform(len)
counts_col3 = df.groupby("Col3")["Col3"].transform(len)

mask = (counts_col2 > 5) & (counts_col3 > 5)

df[mask]
Run Code Online (Sandbox Code Playgroud)

输出:

   Col1   Col2    Col3    Col4
0     1  apple  tomato  banana
2     1  apple  tomato  banana
3     1  apple  tomato  banana
4     1  apple  tomato  banana
5     1  apple  tomato  banana
Run Code Online (Sandbox Code Playgroud)