【问题标题】:pandas add column to groupby dataframe熊猫将列添加到 groupby 数据框
【发布时间】:2016-09-08 11:06:26
【问题描述】:

我有这个简单的数据框df:

df = pd.DataFrame({'c':[1,1,1,2,2,2,2],'type':['m','n','o','m','m','n','n']})

我的目标是为每个c 计算type 的值,然后添加一个大小为c 的列。所以开始:

In [27]: g = df.groupby('c')['type'].value_counts().reset_index(name='t')

In [28]: g
Out[28]: 
   c type  t
0  1    m  1
1  1    n  1
2  1    o  1
3  2    m  2
4  2    n  2

第一个问题解决了。那我也可以:

In [29]: a = df.groupby('c').size().reset_index(name='size')

In [30]: a
Out[30]: 
   c  size
0  1     3
1  2     4

如何将size 列直接添加到第一个数据框?到目前为止,我使用map 作为:

In [31]: a.index = a['c']

In [32]: g['size'] = g['c'].map(a['size'])

In [33]: g
Out[33]: 
   c type  t  size
0  1    m  1     3
1  1    n  1     3
2  1    o  1     3
3  2    m  2     4
4  2    n  2     4

哪种方法可行,但有更直接的方法吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用transform 将来自groupby 聚合的列添加回orig df,transform 返回一个Series,其索引与orig df 对齐:

    In [123]:
    g = df.groupby('c')['type'].value_counts().reset_index(name='t')
    g['size'] = df.groupby('c')['type'].transform('size')
    g
    
    Out[123]:
       c type  t  size
    0  1    m  1     3
    1  1    n  1     3
    2  1    o  1     3
    3  2    m  2     4
    4  2    n  2     4
    

    【讨论】:

    【解决方案2】:

    transformlen 的另一种解决方案:

    df['size'] = df.groupby('c')['type'].transform(len)
    print df
       c type size
    0  1    m    3
    1  1    n    3
    2  1    o    3
    3  2    m    4
    4  2    m    4
    5  2    n    4
    6  2    n    4
    

    Series.mapSeries.value_counts 的另一种解决方案:

    df['size'] = df['c'].map(df['c'].value_counts())
    print (df)
       c type  size
    0  1    m     3
    1  1    n     3
    2  1    o     3
    3  2    m     4
    4  2    m     4
    5  2    n     4
    6  2    n     4
    

    【讨论】:

    • 您能否简要解释一下为什么您删除了原始答案的第一部分? (我发现它对我的目标很有用,这与 OP 不同,但问题的标题很好地描述了它(这就是我到达这里的方式))
    【解决方案3】:

    可以计算groupby对象并多次使用:

    g = df.groupby('c')['type']
    
    df = g.value_counts().reset_index(name='counts')
    df['size'] = g.transform('size')
    

    g.value_counts().reset_index(name='counts').assign(size=g.transform('size'))
    

    输出:

       c type  counts  size
    0  1    m       1     3
    1  1    n       1     3
    2  1    o       1     3
    3  2    m       2     4
    4  2    n       2     4
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 2018-10-14
      • 2023-02-09
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 2014-01-03
      相关资源
      最近更新 更多