【问题标题】:python pandas groupby() resultpython pandas groupby() 结果
【发布时间】:2013-07-14 00:23:10
【问题描述】:

我有以下 python pandas 数据框:

df = pd.DataFrame( {
   'A': [1,1,1,1,2,2,2,3,3,4,4,4],
   'B': [5,5,6,7,5,6,6,7,7,6,7,7],
   'C': [1,1,1,1,1,1,1,1,1,1,1,1]
    } );

df
    A  B  C
0   1  5  1
1   1  5  1
2   1  6  1
3   1  7  1
4   2  5  1
5   2  6  1
6   2  6  1
7   3  7  1
8   3  7  1
9   4  6  1
10  4  7  1
11  4  7  1

我想要另一列存储固定(两者)A 和 B 的 C 值的总和值。也就是说,类似于:

    A  B  C  D
0   1  5  1  2
1   1  5  1  2
2   1  6  1  1
3   1  7  1  1
4   2  5  1  1
5   2  6  1  2
6   2  6  1  2
7   3  7  1  2
8   3  7  1  2
9   4  6  1  1
10  4  7  1  2
11  4  7  1  2

我已经尝试过使用 pandas groupby 并且它确实有效:

res = {}
for a, group_by_A in df.groupby('A'):
    group_by_B = group_by_A.groupby('B', as_index = False)
    res[a] = group_by_B['C'].sum()

但我不知道如何以有序的方式将结果从res“获取”到df。对此有任何建议都会非常高兴。谢谢你。

【问题讨论】:

  • D列计算什么?

标签: python group-by pandas


【解决方案1】:

这是一种方法(虽然感觉这应该与应用一起使用,但我无法获得它)。

In [11]: g = df.groupby(['A', 'B'])

In [12]: df1 = df.set_index(['A', 'B'])

size groupby 函数是你想要的,我们必须将它匹配到'A'和'B'作为索引:

In [13]: df1['D'] = g.size()  # unfortunately this doesn't play nice with as_index=False
# Same would work with g['C'].sum()

In [14]: df1.reset_index()
Out[14]:
    A  B  C  D
0   1  5  1  2
1   1  5  1  2
2   1  6  1  1
3   1  7  1  1
4   2  5  1  1
5   2  6  1  2
6   2  6  1  2
7   3  7  1  2
8   3  7  1  2
9   4  6  1  1
10  4  7  1  2
11  4  7  1  2

【讨论】:

  • 谢谢@Andy Hayden!我认为sum 的解决方案更通用。事实上,我在C 中没有1(当size 完美运行时,正如您在解决方案中指出的那样)而是一些浮点数,所以为了使其正常工作,我需要使用@ 987654329@。但无论如何,太棒了,再次感谢你。
  • 我认为您梦寐以求的单行代码是df['D'] = df.groupby(['A', 'B']).transform(np.size)。无论好坏,transform 都在那里。 :-D
  • @DanAllan,D 列是如何计算的?
【解决方案2】:

您还可以使用应用于 groupby 的变换来做一个单行:

df['D'] = df.groupby(['A','B'])['C'].transform('sum')

【讨论】:

    【解决方案3】:

    你也可以使用合并来做一个单行,如下所示:

    df = df.merge(pd.DataFrame({'D':df.groupby(['A', 'B'])['C'].size()}), left_on=['A', 'B'], right_index=True)
    

    【讨论】:

      【解决方案4】:

      你可以使用这个方法:

      columns = ['col1','col2',...]
      df.groupby('col')[columns].sum()
      

      如果您愿意,还可以在.sum() 之后使用.sort_values(by = 'colx', ascending = True/False) 按特定列 (colx) 以升序或降序对最终输出进行排序。

      【讨论】:

        猜你喜欢
        • 2013-03-06
        • 1970-01-01
        • 1970-01-01
        • 2015-06-20
        • 1970-01-01
        • 2020-09-10
        • 2013-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多