2017-04-23 48 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]