2017-04-23 45 views
2

我有两个dataframes:矢量化数据框中查找

df = pd.DataFrame([['A', 'B'], ['B', 'A']], columns=['Mon', 'Tues']) 

    Mon Tues 
0 A B 
1 B A 

lookup = pd.DataFrame([[0, 1], [2, 3]], index=['A', 'B'], columns=df.columns) 

    Mon Tues 
A 0 1 
B 2 3 

每一天,在第一个数据帧的每个关键,我想查找它的值在第二个数据帧。这是做到这一点的一种方法:

output = pd.DataFrame() 
for col in df.columns: 
    output[col] = df[col].map(lookup[col]) 

    Mon Tues 
0 0 3 
1 2 1 

有没有办法让没有显式循环的相同答案?

回答

3

您可以使用replace交换值:

>>> df.replace(lookup) 
    Mon Tues 
0 0  3 
1 2  1 

当传递到replace方法,DataFrames被类似地处理,以嵌套字典。对于每个列标签,该列的值都映射到查找DataFrame中对应索引的值。

2

我假设df中的每列数据是lookup.index的随机顺序,并且lookup.index按排序顺序排列。所以,用它去,这里有一个基于NumPy的矢量化的解决方案,特别是利用其advanced-indexing -

idx = np.argsort(df.values,1) 
df_out = pd.DataFrame(lookup.values[idx,np.arange(idx.shape[1])],columns=df.columns) 

样本输出 -

In [41]: idx = np.argsort(df.values,1) 

In [42]: pd.DataFrame(lookup.values[idx,np.arange(idx.shape[1])],columns=df.columns) 
Out[42]: 
    Mon Tues 
0 0  3 
1 2  1 

如果lookup.index不排序顺序,我们需要做的一些额外的工作 -

sidx = lookup.index.argsort() 
arr_out = lookup.values[idx,np.arange(idx.shape[1])][sidx]