创建将字典中的2个键映射到相同值的数据框列

时间:2019-11-04 20:40:06

标签: python pandas dataframe dictionary hashmap

  

我有2个词典,并且想要创建一个新列以将2个键映射到一个值。

第1区

dict1 = 
{
    "A" :[619, 588],

    "B" : [772, 880],

    "C" : [033, 944],

    "D" : [077, 854]
}

第2区

dict2 = 
{
    "A" : 600,

    "B" : 680,

    "C" : 300,

    "D" : 100
}
  

我想通过创建一个新列“名称”,然后创建另一个映射该“名称”值的列来映射每个ID

ID   Name  Value
619   A     600
588   A     600
772   B     680
880   B     680
033   C     300
944   C     300
077   D     100
854   D     100

5 个答案:

答案 0 :(得分:1)

使用DataFrame.melt + Series.map

df1=pd.DataFrame(dict1)
df1_melt=df1.melt(var_name='Name',value_name='ID')
df1_melt['value']=df1_melt.Name.map(dict2)
#df1_melt=df1_melt.set_index('ID') #If you want ID like index 
print(df1_melt)

输出

  Name   ID  value
0    A  619    600
1    A  588    600
2    B  772    680
3    B  880    680
4    C  033    300
5    C  944    300
6    D  077    100
7    D  854    100

请注意,字典1(dict1)中C和D的值必须读为字符串,因为它们以0开头

dict1 = 
{
    "A" :[619, 588],

    "B" : [772, 880],

    "C" : ['033', '944'],

    "D" : ['077', '854']
}

答案 1 :(得分:1)

如果将第一个字典重新排列为更可行的格式,则问题将变得更加直接。

id_mapper = {x: key for key, value in dict1.items() for x in value}

df = pd.DataFrame(index = [
    "619",
    "588",
    "772",
    "880",
    "033",
    "944",
    "077",
    "854",
])

df['Name'] = df.index.map(id_mapper)
df['Value'] = df['Name'].map(dict2)

>>> df

    ID      Name    Value
0   619     A       600
1   588     A       600
2   772     B       680
3   880     B       680
4   033     C       300
5   944     C       300
6   077     D       100
7   854     D       100

为清楚起见,id_mapper看起来像这样:

{'619': 'A', '588': 'A', '772': 'B', ...}

答案 2 :(得分:1)

使用列表推导和构造函数。


pd.DataFrame([
    dict(ID=el, Name=k, Value=dict2.get(k))
    for k, v in dict1.items()
    for el in v
])

    ID Name  Value
0  619    A    600
1  588    A    600
2  772    B    680
3  880    B    680
4   33    C    300
5  944    C    300
6   77    D    100
7  854    D    100

答案 3 :(得分:1)

假设dict1中的所有值都是唯一的:

d = {v: k for k in dict1 for v in dict1[k]}
df = pd.DataFrame({'ID': list(d.keys()), 'Name': list(d.values())})
>>> df.assign(Value=df['Name'].map(dict2))
    ID Name  Value
0  619    A    600
1  588    A    600
2  772    B    680
3  880    B    680
4  033    C    300
5  944    C    300
6  077    D    100
7  854    D    100

或者:

d = {v: k for k in dict1 for v in dict1[k]}
df = pd.DataFrame({
    'ID': list(d.keys()), 
    'Name': list(d.values()), 
    'Value': [dict2[val] for val in d.values()]})

答案 4 :(得分:1)

toolz.dicttoolz.merge

from toolz.dicttoolz import merge

d1 = merge(map(dict.fromkeys, dict1.values(), dict1))
s = pd.Series(d1).rename_axis('ID')
pd.concat({'Name': s, 'Value': s.map(dict2)}, axis=1).reset_index()

    ID Name  Value
0  619    A    600
1  588    A    600
2  772    B    680
3  880    B    680
4  033    C    300
5  944    C    300
6  077    D    100
7  854    D    100