簡體   English   中英

使用 ChainMap 字典進行一對多映射

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM