【问题标题】:How to get minimum number of occurrences of value in pandas groupby如何在pandas groupby中获得最小出现次数
【发布时间】:2020-07-23 07:17:39
【问题描述】:
          home_team_name  home_team_goal_count
0         Bayern München                     2
1         Bayern München                     2
2         Bayern München                     1
3                   Köln                     2
4                   Köln                     2

我按变量 home_team_name 上的数据分组。

df.groupby("home_team_name")

home_team_goal_count 的值只能是 2 或 1。我想获取最小出现次数 每组中的值。我想要的结果是 1 代表拜仁慕尼黑,0 代表科隆。为了说明拜仁慕尼黑有 2 次 2 和 1 次 1,因此最小值为 1。科隆有 2 次 2 和 0 次 1,因此最小值为 0。

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    SeriesGroupBy.value_counts 的第一个计数值,对所有组合 1,2 重新整形并添加 0,最后通过min 得到最小值:

    s = (df.groupby("home_team_name")['home_team_goal_count']
           .value_counts()
           .unstack(fill_value=0)
           .min(axis=1))
    
    print (s)
    home_team_name
    Bayern München    1
    Köln              0
    dtype: int64
    

    详情

    print (df.groupby("home_team_name")['home_team_goal_count']
             .value_counts()
             .unstack(fill_value=0))
    home_team_goal_count  1  2
    home_team_name            
    Bayern München        1  2
    Köln                  0  2
    

    如果可能,只需要1 或输入数据中的2reindex

    s = (df.groupby("home_team_name")['home_team_goal_count']
           .value_counts()
           .unstack(fill_value=0)
           .reindex([1, 2], axis=1, fill_value=0) 
           .min(axis=1))
    

    【讨论】:

      【解决方案2】:

      让我们尝试使用pd.crosstab

      pd.crosstab(df['home_team_name'], df['home_team_goal_count'])\
          .reindex([1, 2], axis=1, fill_value=0).min(1)
      

      结果:

      home_team_name
      Bayern München    1
      Köln              0
      dtype: int64
      

      【讨论】:

        【解决方案3】:
        import pandas as pd
        import numpy as np
        list1=['Bayern Munchen','Bayern Munchen','Bayern Munchen','FC Koln','FC Koln']
        list2=[2,2,1,2,2]
        d={'Home Team Name':list1,'Home Team Goal Count':list2}
        data=pd.DataFrame(d)
        
        data['Name']= data['Home Team Name'] +" "+ data['Home Team Goal Count'].astype(str)
        
        data['Name']
        Out[39]: 
        0    Bayern Munchen 2
        1    Bayern Munchen 2
        2    Bayern Munchen 1
        3           FC Koln 2
        4           FC Koln 2
        
        name,count=np.unique(data['Name'].tolist(),return_counts=True)
        
        name=[' '.join(x.split(' ')[:-1]) for x in name]
        
        name
        Out[99]: ['Bayern Munchen', 'Bayern Munchen', 'FC Koln']
        
        min_val=pd.DataFrame({"Name":name,"Count":count})
        
        name=[]
        min_val_count=[]
        for x in min_val.Name.unique():
            name.append(min_val[min_val.Name!=x].min()[0])
        if min_val[min_val.Name!=x].min()[1]==2:
            min_val_count.append(0)
        else:
            min_val_count.append(min_val[min_val.Name!=x].min()[1])
        
        
        minimum_val_dict=dict(zip(name,min_val_count))
        
        minimum_val_dict
        Out[104]: {'FC Koln': 0, 'Bayern Munchen': 1}
        

        与上述答案相比,版本稍长。

        【讨论】:

          【解决方案4】:

          甚至另一种方法是使用分类变量,因为状态集是有限的。所以:

          (
              df
              .astype({"home_team_goal_count": "category"})
              .groupby("home_team_name")["home_team_goal_count"]
              .apply(lambda x: x.value_counts().min())
          )
          

          如果您想知道哪个值出现最少,可以调用.idxmin() 而不是.min()

          【讨论】:

            猜你喜欢
            • 2019-08-31
            • 2020-09-11
            • 1970-01-01
            • 2022-11-28
            • 2014-09-08
            • 2020-06-20
            • 1970-01-01
            • 2018-11-22
            • 2020-05-19
            相关资源
            最近更新 更多