Pandas-使用某个单元格标识符对行进行分组和求和



我要做的是取一个类似于下面的表,用Type='Fee'标识所有行,然后将该行的总数添加到其他列匹配的行中(因此,从带有Fee的行中取总数,找到WEEK、STORE和ID匹配的行,并将总数添加到该行中(。我应该注意的是,Week、Store和ID将匹配并且不是Type=Fee的行将是唯一的(只有其中一个(,但我们可能需要将多个费用分组到其中。作为单行示例,下表中的第三行有以下内容:

  • 周=15
  • 存储=US1
  • ID=T3400
  • 总计=13

我想做的是找到与这些条件匹配的行,并添加总和。在这种情况下,这将是第1行。

在这些数据中,将有多个Type='Fee',我想全部折叠到这一行中,我正在努力做的是保持与Fee不同的类型。

我已经给出了预期的输出值。在预期输出中:

  • 第1行总计=1098=200(起始(+13(第3行输入(+885(第8行输入(
  • 第2行总计=287=189(起始(+98(输入后第5行(
  • 第3行总计=15(与输入相比没有变化,因为ID匹配的地方没有费用(
  • 第4行总计=581=146(起始(+435(输入后第6行(
  • 第5行总计=189(没有更改,因为即使Store和ID匹配,它也来自不同的一周(

如您所见,它将找到带有Fee的行,匹配其他3列,求和总数,并且在整个数据集中不再有带有"Fee"的行。显然,这只是数据的一小部分,总共将有大约20000行要处理。

输入:

类型ID>>费用RD费用>费用[/tr>><189>费用>><146>
存储总计
15 US1RE-GT3400200
15 US4 TOT656189
15 US1T340013
16 US4T17315
15 US4T65698
16 US4T1121435
17 US4 TOT656
15 US1T3400885
16 US4MXT1121

看起来您想要按周、存储和ID分组,并获得总和。在将Fee替换为null后,您也可以在Type上使用first来获得正确的类型。

import pandas as pd
import numpy as np
df = pd.DataFrame({'Week': [15, 15, 15, 16, 15, 16, 17, 15, 16],
'Store': ['US1', 'US4', 'US1', 'US4', 'US4', 'US4', 'US4', 'US1', 'US4'],
'Type': ['RE-G', 'TO', 'Fee', 'RD', 'Fee', 'Fee', 'TO', 'Fee', 'MX'],
'ID': ['T3400',
'T656',
'T3400',
'T173',
'T656',
'T1121',
'T656',
'T3400',
'T1121'],
'Total': [200, 189, 13, 15, 98, 435, 189, 885, 146]})

df['Type'].replace('Fee', np.nan, inplace=True)
df = df.groupby(['Week','Store', 'ID'], as_index=False).agg({'Type':'first', 'Total':sum})
print(df)

输出

Week Store     ID  Type  Total
0    15   US1  T3400  RE-G   1098
1    15   US4   T656    TO    287
2    16   US4  T1121    MX    581
3    16   US4   T173    RD     15
4    17   US4   T656    TO    189

最新更新