如果值计数低于阈值分类列Pandas Datafram,则将列值映射到“杂项”

2024-04-25 22:49:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据帧的形状~[200K,40]。dataframe有一个category列(许多列中的一个)具有1000多个唯一值。我可以使用以下方法可视化每个此类唯一列的值计数:

df['column_name'].value_counts()

我现在如何将俱乐部价值观与:

  • value_count小于一个阈值,比如说100,然后将它们映射到,比如说“杂项”?在
  • 还是基于累计行数百分比?在

Tags: 数据方法namedataframedfvalue可视化count
3条回答

您可以从value_counts的索引中提取要屏蔽的值,并使用replace将它们映射到“杂项”:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0, 10, (2000, 2)), columns=['A', 'B'])

frequencies = df['A'].value_counts()

condition = frequencies<200   # you can define it however you want
mask_obs = frequencies[condition].index
mask_dict = dict.fromkeys(mask_obs, 'miscellaneous')

df['A'] = df['A'].replace(mask_dict)  # or you could make a copy not to modify original data

现在,使用value_counts将所有低于阈值的值分组为missional:

^{pr2}$

我认为需要:

df = pd.DataFrame({ 'A': ['a','a','a','a','b','b','b','c','d']})

s = df['A'].value_counts()
print (s)
a    4
b    3
d    1
c    1
Name: A, dtype: int64

如果需要求和下面threshold下的所有值:

^{pr2}$

但如果需要rename索引值低于阈值:

out = s.rename(dict.fromkeys(s.index[s < threshold], 'misc'))
print (out)
a       4
b       3
misc    1
misc    1
Name: A, dtype: int64

如果需要将原始列替换为^{},请使用^{}

df['A'] = np.where(df.groupby('A')['A'].transform('size') < threshold, 'misc', df['A'])
print (df)

      A
0     a
1     a
2     a
3     a
4     b
5     b
6     b
7  misc
8  misc

另一种解决方案:

cond = df['col'].value_counts()
threshold = 100
df['col'] = np.where(df['col'].isin(cond.index[cond >= threshold ]), df['col'], 'miscellaneous')

相关问题 更多 >