首页 > 解决方案 > 如何为 Pandas DataFrame 中的所有唯一值设置相同的频率?

问题描述

我有一个 Pandas DataFrame,它有 2 列:一列用于类别 (PROBLEM_TYPE),另一列用于类别描述。显然,每个类别的描述值计数是不同的,但由于我计划基于此 DataFrame 训练模型,因此我试图为每个类别设置相同的值计数。这样我的模型会更准确。

数据框:

filtered_df.head()

    PROBLEM_TYPE    DESCRIPTION
0   problem_type1   blabla...
1   problem_type1   blablablabla...
2   problem_type3   bla...
3   problem_type7   blablabloblo...
4   problem_type2   blobloble...

这是我调用value_counts()函数时得到的:

filtered_df["PROBLEM_TYPE"].value_counts()

problem_type1            141887
problem_type2             21663
problem_type3             19349
problem_type4             15710
problem_type5              5229
problem_type6              5161
problem_type7              4682
problem_type8              3672
problem_type9              3296
problem_type10             3131
Name: PROBLEM_TYPE, dtype: int64

如您所见,有 10 种不同的问题类型(类别),每种类型都有不同的值计数。我的问题是如何为所有问题类型设置相同的值计数。例如,每种问题类型在 DataFrame 中的计数最小值(即 3131)。

换句话说,如何将每个类别的频率设置为相同,以便下次运行该value_counts()函数时,它看起来像这样:

filtered_df["PROBLEM_TYPE"].value_counts()

problem_type1              3131
problem_type2              3131
problem_type3              3131
problem_type4              3131
problem_type5              3131
problem_type6              3131
problem_type7              3131
problem_type8              3131
problem_type9              3131
problem_type10             3131
Name: PROBLEM_TYPE, dtype: int64

提前致谢。

标签: pythonpandasdataframe

解决方案


您可以执行以下操作:

mi = df["PROBLEM_TYPE"].value_counts().min()
df_filtered = df.sample(frac=1).groupby("PROBLEM_TYPE").head(mi)

此解决方案有两个步骤,找到"PROBLEM_TYPE"最小计数:

mi = df["PROBLEM_TYPE"].value_counts().min()

然后打乱您的数据框行并获取每组的第一个 mi:

df_filtered = df.sample(frac=1).groupby("PROBLEM_TYPE").head(mi)

有关如何洗牌数据帧的讨论,请参见此处。


推荐阅读