【问题标题】:Pandas GroupBy and total sum within groupPandas GroupBy 和组内总和
【发布时间】:2019-06-08 16:49:09
【问题描述】:

假设我有一个如下所示的数据框:

    interview       longitude        latitude
1   A1                  34.2             90.2
2   A1                  54.2             23.5
3   A3                  32.1             21.5
4   A4                  54.3             93.1
5   A2                  45.1             29.5
6   A1                  NaN              NaN
7   A7                  NaN              NaN
8   A1                  NaN              NaN
9   A3                  23.1             38.2
10  A5                  -23.7            -98.4

我希望能够执行某种 groupby 方法来输出每个子组中的总现值。因此,类似这样的期望输出将是:

    interview         longitude         latitude       occurs 
1   A1                  2                2              4
2   A2                  1                1              1
3   A3                  2                2              2
4   A4                  1                1              1
5   A5                  1                1              1    
6   A7                  0                0              1

我尝试使用此命令尝试纬度,但没有得到所需的输出:

df.groupby(by=['interview', 'latitude'])['interview'].count()

谢谢!

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案1】:

    这三种不同的方法可以做到:

     import pandas as pd
        import numpy as np
    
        data = np.array([   
                ['A1',  'A1',   'A3'    ,'A4'   ,'A2'   ,'A1'   ,'A7',  'A1',   'A3',   'A5'],      
                [34.2,  54.2,   32.1,   54.3,   45.1,   np.NaN  ,np.NaN ,np.NaN,    23.1,   -23.7],
                [   90.2,   23.5,   21.5,   93.1,   29.5,       np.NaN,np.NaN   ,np.NaN ,38.2,  -98.4]])
    
    
        df = pd.DataFrame({'**interview**':data[0,:],'**longitude**':data[1,:],'**latitude**':data[2,:]})  
    
        #first way
        df['**occurs**']=1
        print(df.groupby('**interview**')[['**longitude**','**latitude**','**occurs**']].count().\
        reset_index())
        #or
         counts=0
    
    gb = df.groupby(['**interview**'])
    gb1 = df.groupby(['**interview**','**latitude**'])
    counts = gb.size().to_frame(name='**occurs**')
    
    print((counts
       .join(gb1.agg({'**longitude**':lambda x: x.notnull().size}))
     .join(gb1.agg({'**latitude**': lambda x: x.notnull().size}).rename(columns={'**latitude**': '*latitude*'}))
    
       .reset_index()
      ))
    
         #second way
        counts=0
    
        gb = df.groupby(['**interview**'])
        counts = gb.size().to_frame(name='**occurs**')
    
        print((counts
           .join(gb.agg({'**longitude**': 'size'}))
         .join(gb.agg({'**latitude**': 'size'}))
    
           .reset_index()
          ))
    
         #Third way   this just for compare
        print(df.groupby(['**interview**']).agg({'**longitude**':lambda x: x.notnull().sum(),
                                           '**latitude**':lambda x: x.notnull().sum(),
                                           '**interview**': 'size'})\
                                     .rename(columns={'**interview**':'**occurs**'}))
    

    在此处查看代码:https://repl.it/repls/OldVirtuousBooleanvalue

    【讨论】:

      【解决方案2】:

      无需使用 agg,只需将列传递给 groupby。 Count 返回非空值的计数

      df.groupby('interview')[['interview','longitude','latitude']].count()
      
      
              interview   longitude   latitude
      interview           
      A1      4           2           2
      A2      1           1           1
      A3      2           2           2
      A4      1           1           1
      A5      1           1           1
      A7      1           0           0
      

      【讨论】:

      • 我不知道您可以将分组依据的列传递给 groupby。这很有用。
      【解决方案3】:

      groupby + sum 之前使用notna

      s1=(df[['**longitude**','**latitude**']].notna()).groupby(df['**interview**']).sum()
      s2=df.groupby(df['**interview**']).size()# note size will count the NaN value as well 
      pd.concat([s1,s2.to_frame('**occurs** ')],axis=1)
      Out[115]: 
                     **longitude**  **latitude**  **occurs** 
      **interview**                                          
      A1                       2.0           2.0            4
      A2                       1.0           1.0            1
      A3                       2.0           2.0            2
      A4                       1.0           1.0            1
      A5                       1.0           1.0            1
      A7                       0.0           0.0            1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        • 2019-08-11
        • 1970-01-01
        • 2020-02-25
        • 1970-01-01
        相关资源
        最近更新 更多