Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python合并数据框架和列表字典_Python_Pandas_Dictionary - Fatal编程技术网

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

Python合并数据框架和列表字典,python,pandas,dictionary,Python,Pandas,Dictionary,数据帧如下所示: 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) 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

数据帧如下所示:

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)
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]}
     }
字典是这样的:

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)
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]}
     }
根据'ID'和'V'的值,我可以从字典访问列表,即dct[2]['G']。如何对此应用合并

简而言之,我想将特定列表作为一行附加到dataframe

预期结果应如下所示:

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 )
从字典
dct
创建数据帧并转换为数据帧后使用:


对于动态重命名,请使用:

df2.assign(**pd.DataFrame(m.lookup(s.index,s).tolist()).rename(columns=lambda x:f"Q{x+1}"))

或:


我最好的朋友


您可以将
dict
转换为具有多索引的数据帧,然后合并

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

@anky_91打字错误已修复。基本上,我试图将基于键的特定列表作为一行附加到数据帧中。比在行上迭代、通过“ID”和“V”键获取列表然后合并更好的方法。试图避免行迭代。这个用例是什么?这是一个更大问题的一部分,我计算嵌套参数的默认概率。看我昨天的问题:这太完美了。想象一下有100个像Qn这样的列。要添加动态命名吗?就像len(list)一样,然后将数字1赋给len(list)的值。@Prish确定Q从0开始可以吗?例如
df2.assign(**pd.DataFrame(m.lookup(s.index,s.tolist())。添加前缀('Q'))
是的,我想它会好的。在最后阶段我有一些想法。感谢@anky[u提供的帮助,我在哪里可以找到应用于dataframe的“**”文档?我想了解更多。编辑:没关系。算了。@Prish我推荐你这样,很有创意(没有意外):)你的也一样!我从来没有想到会这样做,而且它非常紧凑:D
df2.assign(**pd.DataFrame(m.lookup(s.index,s).tolist()).add_prefix('Q'))
   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
df2.assign(**pd.DataFrame(dict(enumerate(pd.DataFrame(dct)
                                           .lookup(df2['V'],
                                                   df2['ID']),1)))
               .add_prefix('Q'))

   ID  V  AAA  AA  A  BBB  Q1  Q2  Q3
0   1  F    0   0  0    0   2   8  10
1   2  G    1   2  3    4   3   5   7
2   3  H    1   2  3    4   5   6   8
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