重新排列pandas groupBy输出,使第二个groupBy标签作为标题位于顶部



概述

以下是我想要如何显示DataFrame:

Male  Female
Sport_Played              
Basketball       1       2
Hockey           2       1
Soccer           2       1
Volleyball       2       1

以下是目前的安排:

Sport_Played  Male_or_Female
Basketball    Female            2
Male              1
Hockey        Female            1
Male              2
Soccer        Female            1
Male              2
Volleyball    Female            1
Male              2

有比我下面做的更好的方法吗?

我的代码

# Sample DataFrame
df = pd.DataFrame(list([['Male', 'Soccer', '18'], ['Male', 'Soccer', '18'], ['Male', 'Hockey', '18'],
['Male', 'Hockey', '18'], ['Female', 'Basketball', '18'], ['Male', 'Volleyball', '18'],
['Male', 'Volleyball', '18'], ['Female', 'Basketball', '18'], ['Female', 'Soccer', '18'],
['Female', 'Hockey', '18'], ['Female', 'Volleyball', '18'], ['Male', 'Basketball', '18']]),
columns=['Male_or_Female', 'Sport_Played', 'Age'])
# This is how my output is originally summarized
groupOG= df.groupby(by=['Sport_Played', 'Male_or_Female'])['Sport_Played'].count()
# This is my workaround
group1 = df[df['Male_or_Female'] == 'Male'].groupby(by='Sport_Played')['Sport_Played'].count()
group2 = df[df['Male_or_Female'] == 'Female'].groupby(by='Sport_Played')['Sport_Played'].count()
groupWorkaround= pd.DataFrame({'Male': group1, 'Female': group2})
print(groupOG, groupWorkaround)

您可以在此处使用pd.crosstab

pd.crosstab(df['Sport_Played'], df['Male_or_Female'])
Male_or_Female  Female  Male
Sport_Played
Basketball           2     1
Hockey               1     2
Soccer               1     2
Volleyball           1     2

使用pd.pivot_table

df.pivot_table(index='Sport_Played', columns = 'Male_or_Female',aggfunc='size')
Male_or_Female  Female  Male
Sport_Played
Basketball           2     1
Hockey               1     2
Soccer               1     2
Volleyball           1     2

df.groupbyGroupBy.sizedf.unstack

df.groupby(['Sport_Played','Male_or_Female']).size().unstack()
# Same output as above

最新更新