2016-09-14 93 views
0

我有兩個數據幀可以說:與列「名」python中是否有任何列匹配或行匹配函數?

name 
0 4 
1 2 
2 1 
3 3 

有兩列的另一數據幀乙即名稱和值

name value 
0 3  5 
1 2  6 
2 4  7 
3 1  8 

我要重新排列的

數據幀一數據幀B中的值根據數據幀中的名稱列A

我期待的最終數據幀與此類似:

name value 
0 4  7 
1 2  6 
2 1  8 
3 3  5 
+2

http://stackoverflow.com/questions/13838405 /定製分揀中盤das-dataframe –

回答

1

這裏有兩種選擇:

dfB.set_index('name').loc[dfA.name].reset_index() 
Out: 
    name value 
0  4  7 
1  2  6 
2  1  8 
3  3  5 

或者,

dfA['value'] = dfA['name'].map(dfB.set_index('name')['value']) 

dfA 
Out: 
    name value 
0  4  7 
1  2  6 
2  1  8 
3  3  5 

時序:

import numpy as np 
import pandas as pd 
prng = np.random.RandomState(0) 
names = np.arange(10**7) 
prng.shuffle(names) 
dfA = pd.DataFrame({'name': names}) 
prng.shuffle(names) 
dfB = pd.DataFrame({'name': names, 'value': prng.randint(0, 100, 10**7)}) 

%timeit dfB.set_index('name').loc[dfA.name].reset_index() 
1 loop, best of 3: 2.27 s per loop 

%timeit dfA['value'] = dfA['name'].map(dfB.set_index('name')['value']) 
1 loop, best of 3: 1.65 s per loop 

%timeit dfB.set_index('name').ix[dfA.name].reset_index() 
1 loop, best of 3: 1.66 s per loop 
+0

哪個在時間複雜度或性能方面更好?以及如何找到這些細微差別? –

+0

@HarshavardhanRamanna他們之間的主要區別是'map'會返回'NaN'如果沒有找到值。另一方面,'loc'會完全丟失該行。我已經添加了時間表,我不認爲表現有很大的不同。第一個比較慢,但主要是因爲'.loc'通常比較慢。當你用'.ix'替換它們時,它們幾乎是一樣的。 – ayhan