2016-09-14 68 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