[英]One to many mapping with a ChainMap Dictionary
我想使用以下列表和映射字典進行一對多映射:
l1 = ['a', 'b', 'c']
l2 = ['a', 'c', 'd']
l3 = ['d', 'e', 'f']
mapping_dict = ChainMap(
dict.fromkeys(l1, 'A'),
dict.fromkeys(l2, 'B'),
dict.fromkeys(l3, 'C'))
這是我的 dataframe:
df = pd.DataFrame({'code': ['a', 'b', 'c', 'd', 'e', 'f'], 'value': [1, 2, 3, 4, 5, 6]})
print(df)
code value
0 a 1
1 b 2
2 c 3
3 d 4
4 e 5
5 f 6
當我按如下方式進行映射時:
df['mapping'] = df['code'].map(mapping_dict.get)
code value mapping
0 a 1 A
1 b 2 A
2 c 3 A
3 d 4 B
4 e 5 C
5 f 6 C
問題是我想做一個一對多的映射,但我沒有捕捉到這種關系。 期望的結果將是這樣的。 當存在多個關系時,這會創建一個新行。
code value mapping
0 a 1 A
1 a 1 B
2 b 2 A
3 c 3 A
4 c 3 B
5 d 4 B
6 d 4 C
7 e 5 C
8 e 5 C
9 f 6 C
感謝您的支持。
這里不能使用ChainMap
,因為它不會保留所有重復鍵。 解決方案是從每對 (mapping, code) 創建一個中間值 dataframe,然后將其與原始 dataframe 左merge
pairs = [('A', l1), ('B', l2), ('C', l3)]
mapping = pd.DataFrame(pairs, columns=['mapping', 'code'])
df.merge(mapping.explode('code'), how='left')
結果
code value mapping
0 a 1 A
1 a 1 B
2 b 2 A
3 c 3 A
4 c 3 B
5 d 4 B
6 d 4 C
7 e 5 C
8 f 6 C
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.