我有一个包含很多行的数据框。有时,价值观是其中之一,对我的目的不是很有用。
如何从第 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)
全局计数
使用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)
(更新)按
列计数
调用apply与pd.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.
转换的简单方法
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)