如果该类别的值计数小于10,我想用“其他”替换熊猫数据框中的所有类别。
我正在尝试类似的事情。
df['variable'].where(df['variable'].apply(lambda x: x.map(x.value_counts()))<=10, "other")
但是出现以下错误:
AttributeError: 'str' object has no attribute 'map'
答案 0 :(得分:0)
您可以通过pd.Series.value_counts
计算每个值的计数数量,然后确定上限以下的计数。然后将pd.DataFrame.loc
与布尔索引一起使用:
counts = df['variable'].value_counts()
idx = counts[counts.lt(10)].index
df.loc[df['variable'].isin(idx), 'A'] = 'Others'
通常应避免使用apply
+ lambda
,因为这是非矢量化的,只不过是一个薄纱环。这是一个带有数字数据并添加了列以说明其逻辑的工作示例:
np.random.seed(0)
arr = np.random.randint(0, 12, 100)
df = pd.DataFrame({'A': arr, 'B': arr})
counts = df['A'].value_counts()
idx = counts[counts.lt(10)].index
df['counts'] = df['A'].map(counts)
df.loc[df['A'].isin(idx), 'B'] = -1
print(df)
A B counts
0 5 -1 9
1 0 -1 9
2 3 3 14
3 11 -1 5
4 3 3 14
5 7 7 10
6 9 -1 9
7 3 3 14
8 5 -1 9
9 2 -1 5
10 4 4 13