2017-04-19 52 views
3

我有兩個dataframes:Python的大熊貓複製列從DF到另一個,如果相同的價值觀

DF ONE:

ID  A B C 
1  x y z 
1  x y z 
2  x y z 
2  x y z 
2  x y z 
3  x y z 

DF二:

ID  D E F 
1  a b c1 
2  a b c2 
3  a b c3 

我想以DF TWO爲例,以E爲例,並將其放在DF ONE上,如果ID相同,那麼在我將ge牛逼的輸出:

ID  A B C F 
1  x y z c1 
1  x y z c1 
2  x y z c2 
2  x y z c2 
2  x y z c2 
3  x y z c3 

感謝你的幫助

+0

你可能會看到我的問題有見地的問題的方法:http://stackoverflow.com/questions/43311266/merging-two-dataframe-on-column-and-index –

回答

4

可以使用map通過dict

d = df2.set_index('ID')['F'].to_dict() 
print (d) 
{1: 'c1', 2: 'c2', 3: 'c3'} 

df1['F'] = df1['ID'].map(d) 
print (df1) 
    ID A B C F 
0 1 x y z c1 
1 1 x y z c1 
2 2 x y z c2 
3 2 x y z c2 
4 2 x y z c2 
5 3 x y z c3 

另一種解決方案是map通過Series

s = df2.set_index('ID')['F'] 
print (s) 
ID 
1 c1 
2 c2 
3 c3 
Name: F, dtype: object 

df1['F'] = df1['ID'].map(s) 
print (df1) 
    ID A B C F 
0 1 x y z c1 
1 1 x y z c1 
2 2 x y z c2 
3 2 x y z c2 
4 2 x y z c2 
5 3 x y z c3 

時序

#[60000 rows x 5 columns] 
df1 = pd.concat([df1]*10000).reset_index(drop=True) 

In [115]: %timeit pd.merge(df1, df2[['ID', 'F']],how='left') 
100 loops, best of 3: 11.1 ms per loop 

In [116]: %timeit df1['ID'].map(df2.set_index('ID')['F']) 
100 loops, best of 3: 3.18 ms per loop 

In [117]: %timeit df1['ID'].map(df2.set_index('ID')['F'].to_dict()) 
100 loops, best of 3: 3.36 ms per loop 

In [118]: %timeit df1['ID'].map({k:v for k, v in df2[['ID', 'F']].as_matrix()}) 
100 loops, best of 3: 3.44 ms per loop 

In [119]: %%timeit 
    ...: df2.index = df2['ID'] 
    ...: df1['F1'] = df1['ID'].map(df2['F']) 
    ...: 
100 loops, best of 3: 3.33 ms per loop 
+0

非常好的時機比較! – MaxU

+0

@MaxU - 謝謝。 – jezrael

1

您可以使用map,正與df2.index = df2['ID']設置ID爲您的數據框兩指數的護理:

In [10]: df1['F'] = df1['ID'].map(df2['F']) 

In [11]: df1 
Out[11]: 
    ID A B C F 
0 1 x y z c1 
1 1 x y z c1 
2 2 x y z c2 
3 2 x y z c2 
4 2 x y z c2 
5 3 x y z c3 
+0

無法正常工作。也許這是因爲我的數據框中的ID列不是索引列? – TheDaJon

+0

是的,你應該在第二個數據框中將它設置爲索引。如果您從.csv文件導入,請嘗試使用'pd.read_csv(filename.csv,index_col ='ID')',否則將其設置爲'df2.index = df2 ['ID']'。它雖然需要很多時間,但它的工作原理是 –

2

您需要創建從df2的地圖,你可以這樣做:

mapping = {k:v for k, v in df2[['ID', 'F']].as_matrix()} 

然後把它們應用到df1

df1['F'] = df1['ID'].map(mapping) 

或者你可以使用:

df1 = pd.merge(df1, df2[['ID', 'F']],how='left') 
+0

。任何想法如何加快它? – TheDaJon

+0

'合併'應該工作得更快。 – zipa

+0

嗯,'merge'在'map'中比較慢,請參閱我的答案中的'timing'。 – jezrael