陷入 pandas 的数据问题。参见以下数据:| Product | Level | Cost | --------- ------- ------| Prod_A | L1 | 100 || Prod_A | L1 | 100 || Prod_A | L1 | 200 || Prod_A | L2 | 100 || Prod_A | L3 | 100 || Prod_B | L1 | 150 || Prod_B | L1 | 150 || Prod_B | L2 | 200 || Prod_B | L2 | 300 || Prod_C | L3 | 100 |规则是:每个独特的(产品、级别)组合只有一个成本。如果每个唯一(产品、级别)组合有多个成本,则根据成本值(L1 A 是最小成本)在级别值(L1 A、L1 B 等)中添加一个字母。如果(产品,级别)组合具有唯一的成本,则不执行任何操作。期望的输出:| Product | Level | Cost | --------- ------- ------| Prod_A | L1 A | 100 || Prod_A | L1 A | 100 || Prod_A | L1 B | 200 || Prod_A | L2 | 100 || Prod_A | L3 | 100 || Prod_B | L1 | 150 || Prod_B | L1 | 150 || Prod_B | L2 A | 200 || Prod_B | L2 B | 300 || Prod_C | L3 | 100 |
1 回答
繁花不似锦
TA贡献1851条经验 获得超4个赞
这是一种方法:
charlist='ABCDEFG'
dd = {k:' '+v for k, v in enumerate(charlist)}
df['Level'] += df.groupby(['Product', 'Level'])['Cost']\
.transform(lambda x: x.factorize()[0] if x.nunique()>1 else -1)\
.map(dd).fillna('')
输出:
Product Level Cost
0 Prod_A L1 A 100
1 Prod_A L1 A 100
2 Prod_A L1 B 200
3 Prod_A L2 100
4 Prod_A L3 100
5 Prod_B L1 150
6 Prod_B L1 150
7 Prod_B L2 A 200
8 Prod_B L2 B 300
9 Prod_C L3 100
细节:
首先,创建要附加的字符的字典。
然后groupby使用transform唯一的“编码”每个成本的产品和级别pd.Series.factorize,如果只有一个成本金额,则使用 -1。
最后,使用字典映射“编码”成本的结果并用空白字符串填充。
添加回答
举报
0/150
提交
取消