陷入 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
提交
取消