我要做的是取一个类似于下面的表,用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总计 | ||
---|---|---|---|---|
15 | US1 | >RE-G | T3400 | 200 |
15 | US4 | TO | >T656 | 189 |
15 | US1 | 费用T3400 | 13 | |
16 | US4 | RDT173 | 15 | |
15 | US4 | 费用T656 | >98 | |
16 | US4 | 费用T1121 | 435 | [/tr>|
17 | US4 | TO | >T656 | <189>|
15 | US1 | 费用T3400 | >885 | |
16 | US4 | >MX | T1121 | <146>
看起来您想要按周、存储和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