【问题标题】:How to ignore specific column in dataframe when doing an aggregation进行聚合时如何忽略数据框中的特定列
【发布时间】:2020-05-04 19:06:23
【问题描述】:

有没有办法在数据框上进行 pandas groupby 聚合并从列中返回某个字符串? 我有一个像这样的数据框:

lst = [[ 100, 'buicks', .001, np.nan, np.nan], [101, 'chevy', .002, np.nan, np.nan],
       [102, 'olds', .003, .006, np.nan], [100, 'buick', np.nan, .004, np.nan],
       [103, 'nissan', np.nan, np.nan, .1], [103,'nissans', np.nan, .14, np.nan]]
df = pd.DataFrame(lst, columns=['car_id', 'name', 'aa', 'bb', 'cc'])
   car_id     name     aa     bb   cc
0     100   buicks  0.001    NaN  NaN
1     101    chevy  0.002    NaN  NaN
2     102     olds  0.003  0.006  NaN
3     100    buick    NaN  0.004  NaN
4     103   nissan    NaN    NaN  0.1
5     103  nissans    NaN  0.140  NaN

需要这个:

0     100   buicks  0.001  0.004  NaN
1     101    chevy  0.002    NaN  NaN
2     102     olds  0.003  0.006  NaN
4     103  nissans    NaN  0.140  0.1

我要做的是按 car_id 列分组,然后对 aa、bb、cc 列求和。但是,名称列值可能不一样,但我需要保留其中一个。我不在乎哪一个。 我在看:Pandas sum by groupby, but exclude certain columns 结果是这样的:

df.groupby('car_id').agg({'aa': np.sum, 'bb': np.sum, 'cc':np.sum})

但这会删除名称列。我假设我可以在上面的语句中添加名称列,并且可以在其中放置一个操作来返回字符串。

谢谢

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    是的,您确实可以将first 用于name 列:

    df.groupby('car_id').agg({'name':'first',
                              'aa':'sum',
                              'bb':'sum',
                              'cc':'sum'})
    

    输出:

              name     aa     bb   cc
    car_id                           
    100     buicks  0.001  0.004  0.0
    101      chevy  0.002  0.000  0.0
    102       olds  0.003  0.006  0.0
    103     nissan  0.000  0.140  0.1
    

    【讨论】:

      【解决方案2】:

      这里有 lambda,以防你想要 NaN:

      df.groupby('car_id').agg({'name':'first', 'aa':'sum', 'bb':'sum', 'cc': lambda x: x.sum(skipna=False)})
      

      【讨论】:

        【解决方案3】:

        满足你的输出

        s=df.groupby(['car_id'])[['aa','bb','cc']].sum(min_count=1)
        s['name']=df.drop_duplicates('car_id').set_index('car_id').name
        s
        Out[185]: 
                   aa     bb   cc    name
        car_id                           
        100     0.001  0.004  NaN  buicks
        101     0.002    NaN  NaN   chevy
        102     0.003  0.006  NaN    olds
        103       NaN  0.140  0.1  nissan
        

        【讨论】:

          【解决方案4】:
          pd.concat([df.groupby('car_id').apply(lambda x: x.head(1))[['car_id','name']].set_index('car_id'), \
          df.groupby('car_id').agg({'aa': np.sum, 'bb': np.sum, 'cc':np.sum}).reset_index().set_index('car_id')], axis = 1).reset_index()
          
          
              car_id  name    aa  bb  cc
          0   100 buicks  0.001   0.004   0.0
          1   101 chevy   0.002   0.000   0.0
          2   102 olds    0.003   0.006   0.0
          3   103 nissan  0.000   0.140   0.1
          

          【讨论】:

            猜你喜欢
            • 2021-07-26
            • 2019-01-09
            • 2015-05-20
            • 2011-01-23
            • 2017-07-27
            • 2021-04-17
            • 1970-01-01
            • 2016-09-10
            • 1970-01-01
            相关资源
            最近更新 更多