Python合并数据框和列表字典字典

Pri*_*ish 2 python dictionary pandas

数据框如下所示:

d = {'ID': [1, 2,3],'V':['F','G','H'],'AAA':[0,1,1],'AA':[0,2,2],'A':[0,3,3],'BBB':[0,4,4]}
df2 = pd.DataFrame(data=d)
Run Code Online (Sandbox Code Playgroud)

和字典看起来像这样:

dct ={1:{'F':[2,3,5],'G':[3,5,6],'H':[6,7,8]},
      2:{'F':[1,3,5],'G':[8,5,6],'H':[9,7,8]},
      3:{'F':[5,3,5],'G':[4,5,6],'H':[10,7,8]}
     }
Run Code Online (Sandbox Code Playgroud)

根据“ID”和“V”的值,我可以访问字典中的列表,即 dct[2]['G']。如何对此应用合并?

简而言之,我想将特定列表作为一行附加到数据框。

预期结果应如下所示:

op_d = {'ID': [1, 2,3],'V':['F','G','H'],'AAA':[0,1,1],'AA':[0,2,2],'A':[0,3,3],'BBB':[0,4,4],'Q1':[2,8,10],'Q2':[3,5,7],'Q3':[5,6,8]}
output_df = pd.DataFrame(data=op_d )
Run Code Online (Sandbox Code Playgroud)

ank*_*_91 7

使用df.lookup从字典创建一个数据帧后dct和隐蔽的数据帧,然后assign

m = pd.DataFrame(dct).T
s = df2.set_index('ID')['V']
output = df2.assign(**pd.DataFrame(m.lookup(s.index,s).tolist(),columns=['Q1','Q2','Q3']))
Run Code Online (Sandbox Code Playgroud)
print(output)

   ID  V  AAA  AA  A  BBB  Q1  Q2  Q3
0   1  F    0   0  0    0   2   3   5
1   2  G    1   2  3    4   8   5   6
2   3  H    1   2  3    4  10   7   8
Run Code Online (Sandbox Code Playgroud)

对于动态重命名使用:

df2.assign(**pd.DataFrame(m.lookup(s.index,s).tolist()).rename(columns=lambda x:f"Q{x+1}"))
Run Code Online (Sandbox Code Playgroud)
   ID  V  AAA  AA  A  BBB  Q1  Q2  Q3
0   1  F    0   0  0    0   2   3   5
1   2  G    1   2  3    4   8   5   6
2   3  H    1   2  3    4  10   7   8
Run Code Online (Sandbox Code Playgroud)

或者:

df2.assign(**pd.DataFrame(m.lookup(s.index,s).tolist()).add_prefix('Q'))
Run Code Online (Sandbox Code Playgroud)
   ID  V  AAA  AA  A  BBB  Q0  Q1  Q2
0   1  F    0   0  0    0   2   3   5
1   2  G    1   2  3    4   8   5   6
2   3  H    1   2  3    4  10   7   8
Run Code Online (Sandbox Code Playgroud)


ALo*_*llz 5

您可以将您的dict变成带有 MultiIndex 的 DataFrame 然后合并。

d2 = {(k, k2): v2 for k,v in dct.items() for k2,v2 in v.items()}

u = pd.DataFrame(d2.values(), index=d2.keys())
#u = pd.DataFrame(d2).T 
u.columns = [f'Q{i+1}' for i in u.columns]

df2.merge(u, left_on=['ID', 'V'], right_index=True)

#   ID  V  AAA  AA  A  BBB  Q1  Q2  Q3
#0   1  F    0   0  0    0   2   3   5
#1   2  G    1   2  3    4   8   5   6
#2   3  H    1   2  3    4  10   7   8
Run Code Online (Sandbox Code Playgroud)