我在数据框中有一些这样的客户数据:
S No Country Sex
1 Spain M
2 Norway F
3 Mexico M
...
我想要这样的输出:
Spain
M = 1207
F = 230
Norway
M = 33
F = 102
...
我有一个基本概念,我想根据他们所在的国家/地区对行进行分组,例如df.groupby(df.Country)
,然后在选定的行上运行df.Sex.value_counts()
谢谢!
答案 0 :(得分:2)
我认为需要crosstab
:
df = pd.crosstab(df.Sex, df.Country)
或者,如果要使用您的解决方案,请为第一级MultiIndex
的列添加unstack
:
df = df.groupby(df.Country).Sex.value_counts().unstack(level=0, fill_value=0)
print (df)
Country Mexico Norway Spain
Sex
F 0 1 0
M 1 0 1
编辑:
如果要添加更多列,则可以设置将哪个级别参数转换为列:
df1 = df.groupby([df.No, df.Country]).Sex.value_counts().unstack(level=0, fill_value=0).reset_index()
print (df1)
No Country Sex 1 2 3
0 Mexico M 0 0 1
1 Norway F 0 1 0
2 Spain M 1 0 0
df2 = df.groupby([df.No, df.Country]).Sex.value_counts().unstack(level=1, fill_value=0).reset_index()
print (df2)
Country No Sex Mexico Norway Spain
0 1 M 0 0 1
1 2 F 0 1 0
2 3 M 1 0 0
df2 = df.groupby([df.No, df.Country]).Sex.value_counts().unstack(level=2, fill_value=0).reset_index()
print (df2)
Sex No Country F M
0 1 Spain 0 1
1 2 Norway 1 0
2 3 Mexico 0 1
答案 1 :(得分:1)
您也可以使用pandas.pivot_table
:
res = df.pivot_table(index='Country', columns='Sex', aggfunc='count', fill_value=0)
print(res)
SNo
Sex F M
Country
Mexico 0 1
Norway 1 0
Spain 0 1