2014-09-19 79 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