Pandas 将单个列拆分为多个总和列

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

这里有一个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   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)