Pandas 将单个列拆分为多个总和列
这里有一个Noob问题 假设我有一个数据帧:Pandas 将单个列拆分为多个总和列,pandas,Pandas,这里有一个Noob问题 假设我有一个数据帧: id Name Sex Age Country Sport Medal 119932 K Thompson M 26 United States Basketball Gold 120121 V Thrasher F 19 United States Shooting Gold 122093 M Troy M
id Name Sex Age Country Sport Medal
119932 K Thompson M 26 United States Basketball Gold
120121 V Thrasher F 19 United States Shooting Gold
122093 M Troy M 27 United States Volleyball Bronze
123943 J Valente F 21 United States Cycling Silver
125943 D Verburg M 25 United States Athletics Gold
71921 L Xiaojun M 20 China Weightlifting Silver
69571 L Yuehong M 26 China Shooting Bronze
69955 L Chaopan M 20 China Gymnastics Bronze
69978 L Li F 24 China Volleyball Gold
123361 L Unsworth F 21 Great Britain Hockey Gold
128077 B Walkden F 22 Great Britain Taekwondo Bronze
128145 C Walker M 28 Great Britain Swimming Silver
128156 D Wallace M 20 Great Britain Swimming Silver
现在我可以通过循环,使用if语句,等等来完成所有这些。。。但我想知道是否有办法按国家对数据进行分组(使用GroupBy),然后我创建了三个列,列出赢得的奖牌数量,如下所示:
Gold Silver Bronze
Country
Great Britian 1 2 1
China 1 1 2
United States 3 1 1
那么,我如何(或者可能)使用lambda和.apply()对数据帧创建一个新列呢
fill_value
参数一起使用,以0替换任何NAN,并展平数据帧df.groupby(['Country','Medal']).size().unstack(fill_value=0)
fill_value
参数一起使用,以0替换任何NAN,并展平数据帧df.groupby(['Country','Medal']).size().unstack(fill_value=0)
这只是一个pd.交叉表
:
pd.crosstab(df['Country'], df['Medal'])
输出:
Medal Bronze Gold Silver
Country
China 2 1 1
Great Britain 1 1 2
United States 1 3 1
Medal Gold Silver Bronze
Country
China 1 1 2
Great Britain 1 2 1
United States 3 1 1
如果您想要奖牌的具体顺序,请使用重新索引:
(pd.crosstab(df['Country'], df['Medal'])
.reindex(['Gold', 'Silver', 'Bronze'], fill_value=0, axis=1)
)
输出:
Medal Bronze Gold Silver
Country
China 2 1 1
Great Britain 1 1 2
United States 1 3 1
Medal Gold Silver Bronze
Country
China 1 1 2
Great Britain 1 2 1
United States 3 1 1
这只是一个交叉表:
pd.crosstab(df['Country'], df['Medal'])
输出:
Medal Bronze Gold Silver
Country
China 2 1 1
Great Britain 1 1 2
United States 1 3 1
Medal Gold Silver Bronze
Country
China 1 1 2
Great Britain 1 2 1
United States 3 1 1
如果您想要奖牌的具体顺序,请使用重新索引:
(pd.crosstab(df['Country'], df['Medal'])
.reindex(['Gold', 'Silver', 'Bronze'], fill_value=0, axis=1)
)
输出:
Medal Bronze Gold Silver
Country
China 2 1 1
Great Britain 1 1 2
United States 1 3 1
Medal Gold Silver Bronze
Country
China 1 1 2
Great Britain 1 2 1
United States 3 1 1
这是我想要的结果的一半,然而,“国家”列不是索引的一部分,它丢失了。df.columns给出了以下内容:索引(['brown','Gold','Silver',dtype='object',name='Medal')。因此,如果我想知道“伟大的英国人”获得的奖牌总数,那是不可能的。国家是指数。您可以这样访问它:
df.loc['United']
例如。但是,如果您交换组的顺序,它应该会像您期望的那样工作。尝试执行df.groupby(['Medal',Country']).size().unstack(fill_value=0)
。我想要的结果已经得到一半了,但是,“Country”列不是索引的一部分,它丢失了。df.columns给出了以下内容:索引(['brown','Gold','Silver',dtype='object',name='Medal')。因此,如果我想知道“伟大的英国人”获得的奖牌总数,那是不可能的。国家是指数。您可以这样访问它:df.loc['United']
例如。但是,如果您交换组的顺序,它应该会像您期望的那样工作。尝试执行df.groupby(['Medal','Country']).size().unstack(fill\u value=0)
。