如何通过使用 Python 对特定列进行分组来求和?

Posted

技术标签:

【中文标题】如何通过使用 Python 对特定列进行分组来求和?【英文标题】:How to sum by agrouping a specific column using Python? 【发布时间】:2021-07-01 18:21:07 【问题描述】:

我无法按每个组/列求和。我们的想法是在这个数据集上创建一个新列,其中“存储”的总和:

PNO store   ForecastSUM
17  20054706    WITZ    0.0
8   8007536 WITZ    0.0
2   8007205 WITZ    0.0
12  8601965 WITZ    0.0
5   8007239 WITZ    0.0
14  20054706    ROT 1.0
1   8007205 ROT 7.0
9   8601965 ROT 2.0
6   8007536 ROT 3.0
3   8007239 ROT 2.0
15  20054706    MAR 1.0
7   8007536 MAEG    6.0
10  8601965 MAEG    4.0
4   8007239 MAEG    3.0
0   8007205 MAEG    6.0
13  20054706    BUD 1.0
11  8601965 AYC 0.0
16  20054706    AYC 0.0

我正在尝试应用此代码:

copiedDataWHSE['sumWHSE'] = copiedDataWHSE.groupby(['ForecastSUM']).agg('ForecastSUM': "sum")

我得到的结果是:

PNO store   ForecastSUM sumWHSE
17  20054706    WITZ    0.0 NaN
8   8007536 WITZ    0.0 NaN
2   8007205 WITZ    0.0 4.0
12  8601965 WITZ    0.0 NaN
5   8007239 WITZ    0.0 NaN
14  20054706    ROT 1.0 NaN
1   8007205 ROT 7.0 3.0
9   8601965 ROT 2.0 NaN
6   8007536 ROT 3.0 12.0
3   8007239 ROT 2.0 6.0
15  20054706    MAR 1.0 NaN
7   8007536 MAEG    6.0 7.0
10  8601965 MAEG    4.0 NaN
4   8007239 MAEG    3.0 4.0
0   8007205 MAEG    6.0 0.0
13  20054706    BUD 1.0 NaN
11  8601965 AYC 0.0 NaN
16  20054706    AYC 0.0 NaN

这是错误的,因为我想举个例子,一旦商店 ROT,sumWHSE 列应该收到 19。

【问题讨论】:

如果要在 ForecastSum 上进行聚合,为什么要对其进行分组? 【参考方案1】:

正如@sammywemmy 所说,您需要在store 上进行分组,而不是在ForecastSUM 上:

store_groupby = df.groupby(['store']).agg('ForecastSUM': "sum")

但是,由于它是长度为 6 的 groupby,因此您不能将其作为新列分配回数据帧。

我要做的是将 groupby 转换为字典,然后将 assign() 转换为带有 lambda 函数的新列。

store_groupby_dict = store_groupby.to_dict()

df = df.assign(store_total = lambda x: store_groupby_dict[x.store])

apply() 做同样的事情使它更具可读性:

df['store_total'] = df.store.apply(lambda x: store_groupby_dict[x])

【讨论】:

一旦我应用了 df['store_total'] = df.store.apply(lambda x: store_groupby_dict[x]),就会发生以下错误: KeyError Traceback (最近一次调用最后一次) in () 1 ----> 2copyDataWHSE['store_total'] =copyedDataWHSE['store' ].apply(lambda x: store_groupby_dict[x]) C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds) 3192 else: 3193 值 = self.astype(object).values -> 3194 映射 = lib.map_infer(values, f, convert=convert_dtype) 3195 3196 if len(mapped) and isinstance(mapped[0], Series): pandas/_libs/src\inference.pyx in pandas._libs.lib.map_infer() (x) 1 ----> 2 复制数据WHSE['store_total'] = 复制数据WHSE['store'].apply(lambda x: store_groupby_dict[x]) KeyError: 'WITZ' 没有将 WITZ 识别为键。我该怎么办? ***.com/users/12399409/k-n-c 你能帮帮我吗?

以上是关于如何通过使用 Python 对特定列进行分组来求和?的主要内容,如果未能解决你的问题,请参考以下文章

根据不同的条件对两个不同的列进行分组和求和

如何对来自不同表MySQL的两列求和

通过将两列分组并对第三列数据求和来过滤python

按分组列求和值

分组和求和,使用非聚合标准来确定字段选择

如何对特定列中具有相同值的行求和