2016-09-17 88 views
0

我确信这将是一个'doh'时刻,但我很难尝试复制数据帧之间的一组列, df1中的特定列也在df2中找到。在特定值匹配的Pandas dfs之间复制特定列的集合

DF1的简化版本是这样的: df1

DF2的简化版本是这样的: df2

在这里,我要建的列(COLS)列表,不包括df1中的'p_people_id'字段并在df2中创建这些字段并指定一个nan值。 的cols = columns from df1 != p_people_id 之后DF2看起来是这样的: df2 w appended cols 这些DFS我试图寻找找到所有实例,其中df2.a_people_id == df1.p_people_id并指定DF1的[COLS]值到DF2实例工作。

使用.loc查找实例非常简单。我已经成功地能够选择我想要的cols使用的.loc以及

df2.loc[df2['a_people_id']==df1['p_people_id'][0],np.array(cols)] 

能正常工作的目标和回报:enter image description here

但是,如果我尝试这样的事情来设置/分配

df2.loc[df2['a_people_id']==df1['p_people_id'][0],np.array(cols)]=df1.loc[df1['p_people_id']==df1['p_people_id'][0],np.array(cols)] 

什么也没有发生,我不知道为什么:凡在DF1 ID字段中的ID字段匹配DF2那些特定列。 df2 assignment results

我试图以各种方式利用.ix,.loc,.iloc,.where,.select,.set,但这必须是其中的一个地方,我只是“不做它”对。”我可以发布其他例子,我已经设法让语法正确地找到[cols]特定的id匹配的位置,并且没有错误或'view vs copy'警告被打印,但是也没有任何分配。我在哪里错了?

回答

1

如果我没有弄错,我想你正在寻找一个连接操作。

特别是,在你的描述这条语句:

df2.loc[df2['a_people_id']==df1['p_people_id'][0],np.array(cols)] 

办法“看在df2对于其中p_people_id第一p_people_id匹配所有行和那些行,选择cols

这将产生一组行和一列(在你的例子中是6个,都包含NA),如果我正确地得到了东西,那么你想把这6行与df1中的相应行放在一起,再加上p_people_iddf1

如果我上面的假设是正确的,那么这可以通过简单的连接完成。像这样:

pd.merge(left=df1, left_on="p_people_id", 
     right=df2, right_on="p_people_id") 

如果有DF1 1000不同p_people_id和他们每个人有6条线路在DF2,上面的语句将产生6000行的数据帧。

然后,您可以在结果中选择所需的列。

+0

这看起来像它正在做我正在寻找的除了一点点重复,但这是一个最小的问题,我可以在加入dfs后解决。谢谢! – abou