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

陷入 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  |

规则是:

  1. 每个独特的(产品、级别)组合只有一个成本。

  2. 如果每个唯一(产品、级别)组合有多个成本,则根据成本值(L1 A 是最小成本)在级别值(L1 A、L1 B 等)中添加一个字母。

  3. 如果(产品,级别)组合具有唯一的成本,则不执行任何操作。

期望的输出:

| 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  |


繁星点点滴滴
浏览 73回答 1
1回答

繁花不似锦

这是一种方法: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  Cost0  Prod_A  L1 A   1001  Prod_A  L1 A   1002  Prod_A  L1 B   2003  Prod_A    L2   1004  Prod_A    L3   1005  Prod_B    L1   1506  Prod_B    L1   1507  Prod_B  L2 A   2008  Prod_B  L2 B   3009  Prod_C    L3   100细节:首先,创建要附加的字符的字典。然后groupby使用transform唯一的“编码”每个成本的产品和级别pd.Series.factorize,如果只有一个成本金额,则使用 -1。最后,使用字典映射“编码”成本的结果并用空白字符串填充。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python