2014-09-19 107 views
7

我有以下數據框:熊貓查找基於價值

Date best a b c d 
1990 a  5 4 7 2 
1991 c  10 1 2 0 
1992 d  2 1 4 12 
1993 a  5 8 11 6 

我想提出一個數據幀如下:

Date best value 
1990 a  5 
1991 c  2 
1992 d  12 
1993 a  5 

所以我期待基於另一行尋找價值值使用列名稱。例如,第二個df中的1990的值應該從第一個df查找「a」,第二個行應該從第一個df中查找「c」(= 2)。

任何想法?

回答

4

您創建一個查詢功能,在您的數據幀逐行調用apply,這不是大DFS雖然

In [245]: 

def lookup(x): 
    return x[x.best] 
df['value'] = df.apply(lambda row: lookup(row), axis=1) 
df 
Out[245]: 
    Date best a b c d value 
0 1990 a 5 4 7 2  5 
1 1991 c 10 1 2 0  2 
2 1992 d 2 1 4 12  12 
3 1993 a 5 8 11 6  5 
+0

任何機會,你可以解釋這段代碼如何工作? – 3kstc 2016-11-15 03:30:50

+0

@ 3kstc基本上我們使用'apply'通過傳遞arg'axis = 1來遍歷行,所以這裏的lambda是行,所以對於第一行'x'是第一行,然後我們返回一個特定的列,它在這種情況將是'最好'的值,以索引該行 – EdChum 2016-11-15 09:57:20

4

有一個內置的lookup功能,可以處理這種情況非常有效(按行/列查找)。我不知道它是如何優化的,但可能比適用解決方案更快。

In [9]: df['value'] = df.lookup(df.index, df['best']) 

In [10]: df 
Out[10]: 
    Date best a b c d value 
0 1990 a 5 4 7 2  5 
1 1991 c 10 1 2 0  2 
2 1992 d 2 1 4 12  12 
3 1993 a 5 8 11 6  5 
+1

在玩具數據集上應用需要470us,查找需要531us – EdChum 2014-09-19 13:59:27

+1

因爲某些原因,當我嘗試這樣做時,內存錯誤甚至是中等規模df 4000行對於400行,我使用apply得到8.17ms,使用lookup得到3.05ms,所以我期望查找更好地擴展 – EdChum 2014-09-19 14:04:34

+0

由於語法更簡單,查找可能更受歡迎,但兩者都可以完美工作,thx傢伙! – AtotheSiv 2014-09-20 08:34:48