首页 > 解决方案 > 在循环中将 Groupby 对象转换为 DataFrame 对象

问题描述

我有一个df看起来像这样的数据框

No Country Sex Age Group
1    Spain   M Young
2    Norway  F Middle
3    Mexico  M Elderly
...

我的目标是首先根据国家/地区对这些数据进行分组,然后根据性别和年龄组进行分析,使用.value_counts()

因此,我groupby在这个via上使用df2 = df.groupby(df.Country)并像这样循环

for d in df2:
    print(type(d))

我得到这个输出:

<class 'tuple'>
<class 'tuple'>
<class 'tuple'>
...

我想用

for d in df2:
    print(pd.DataFrame(d).Sex.value_counts())

但我收到了这个错误

DataFrame constructor not properly called!

我昨天问了一个类似的问题,但这仅限于一个非常特殊的查询。我想学习的是知道如何将图层“分组”成块,然后对这些特定的块进行分析。

谢谢!

标签: pythonpandasdataframe

解决方案


我认为更好的是使用:

s = df.groupby('Country').Sex.value_counts()
print (s)
Country  Sex
Mexico   M      1
Norway   F      1
Spain    M      1
Name: Sex, dtype: int64

但是如果想要使用循环是必要的,通过添加另一个变量来解压组和 df 的元组名称i

df2 = df.groupby(df.Country)
for i, d in df2:
    print(type(d))
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>

或使用GroupBy.apply

def func(x):
    print (x)
    a = x.Sex.value_counts()
    #another code 
    return a

df2 = df.groupby(df.Country).apply(func)

推荐阅读