为了账号安全,请及时绑定邮箱和手机立即绑定

如果条件满足 pandas,则根据另一列的升序将字符添加到列

如果条件满足 pandas,则根据另一列的升序将字符添加到列

繁星点点滴滴 2023-09-26 17:22:16
陷入 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。


最后,使用字典映射“编码”成本的结果并用空白字符串填充。


查看完整回答
反对 回复 2023-09-26
  • 1 回答
  • 0 关注
  • 72 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信