如何在Python中使用for循环从每个类别中选择数据子集?

如何在Python中使用for循环从每个类别中选择数据子集?,python,pandas,Python,Pandas,我的客户数据(CSV格式)如下: 例如,每个类别包含各种计数: customer.category.value_counts(): spam 100 not_spam 20 neutral 45 其中: min(customer.category.value_counts()): 20 我想用python编写一个for循环,以创建一个新的数据文件,对于所有类别,它只包含与最小类别计数相同的大小(在这里的示例中,最小类别是而不是垃圾邮件) 我的预期产出是: ne

我的客户数据(CSV格式)如下:

例如,每个类别包含各种计数:

customer.category.value_counts():    

spam       100
not_spam   20
neutral    45
其中:

min(customer.category.value_counts()): 20
我想用python编写一个
for循环
,以创建一个新的数据文件,对于所有
类别
,它只包含与最小类别计数相同的大小(在这里的示例中,最小类别是
而不是垃圾邮件

我的预期产出是:

new_customer.category.value_counts():    

spam       20
not_spam   20
neutral    20

使用groupby更容易:

min\u count=df.category.value\u counts().min()
df.groupby(‘类别’)。头(最小计数)
也就是说,如果你真的想要一个循环,你可以使用它作为一个列表理解,这是更快的:

categories=df.category.unique()
最小计数=df.category.value\u counts().min()
df=pd.concat([df.query('category=@cat')[:分类中的cat的最小计数])

使用
groupby更容易:

min\u count=df.category.value\u counts().min()
df.groupby(‘类别’)。头(最小计数)
也就是说,如果你真的想要一个循环,你可以使用它作为一个列表理解,这是更快的:

categories=df.category.unique()
最小计数=df.category.value\u counts().min()
df=pd.concat([df.query('category=@cat')[:分类中的cat的最小计数])

我随机生成的数据框有38行,类别分布如下:

spam        17
not_spam    16
neutral      5
Name: category, dtype: int64
我在想,你需要做的第一件事是找到最小的类别,一旦你知道了,你就可以使用计算出的值作为每个类别的
n

def示例(df:pd.DataFrame,类别:pd.Series):
阈值=df[类别]。值\计数().min()
对于df[category]中的cat,唯一()
数据=df.loc[df[类别].eq(类别)]
产量数据。样本(阈值)
数据=样本(df,“类别”)
pd.concat(数据,忽略索引=真)


我随机生成的数据帧有38行,类别分布如下:

spam        17
not_spam    16
neutral      5
Name: category, dtype: int64
我在想,你需要做的第一件事是找到最小的类别,一旦你知道了,你就可以使用计算出的值作为每个类别的
n

def示例(df:pd.DataFrame,类别:pd.Series):
阈值=df[类别]。值\计数().min()
对于df[category]中的cat,唯一()
数据=df.loc[df[类别].eq(类别)]
产量数据。样本(阈值)
数据=样本(df,“类别”)
pd.concat(数据,忽略索引=真)


这应该行得通。它不断连接从每个类别生成的top min记录

minval = min(df1.category.value_counts())
df2 = pd.concat([df1[df1.category == cat].head(minval) for cat in df1.category.unique() ])
print(df2)

这应该行得通。它不断连接从每个类别生成的top min记录

minval = min(df1.category.value_counts())
df2 = pd.concat([df1[df1.category == cat].head(minval) for cat in df1.category.unique() ])
print(df2)

谢谢你的评论和代码。“我们可以添加一个随机的种子,使其更好的重复性吗?”比尔金肯定。只需将
random_state
arg添加到
sample()
like
data.sample(阈值,random_state=1)
感谢您的评论和代码。“我们可以添加一个随机的种子,使其更好的重复性吗?”比尔金肯定。只需将
random\u state
arg添加到
sample()
data.sample(阈值,random\u state=1)
注意,您可以用
替换
.head(min\u count)
来获得随机行。注意,您可以用
替换
.head(min\u count)
来获得随机行。