2016-09-17 57 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