Python 基于值的查询

Python 基于值的查询,python,pandas,numpy,dataframe,Python,Pandas,Numpy,Dataframe,我有以下数据帧: 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

我有以下数据帧:

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)


有什么想法吗?

您创建了一个查找函数,并在数据帧行上调用
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
有一个内置函数可以处理这种情况(按行/列查找)。我不知道它有多优化,但可能比应用解决方案快

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

您可以使用
np.where
执行此操作,如下所示。我认为这样会更有效率

将numpy导入为np
作为pd进口熊猫
df=pd.数据帧(['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','a','b','c','d'))
arr=df.best.values
cols=df.columns[2:]
对于col中的col:
arr2=df[col]。值
arr=np.其中(arr==col,arr2,arr)
df.drop(列=cols,原地=True)
df[“值”]=arr
df
结果

Date    best    values
0   1990    a   5
1   1991    c   2
2   1992    d   12
3   1993    a   5

在玩具数据集apply需要470us,lookup需要531usHmm出于某种原因,当我在一个中等大小的df(比如4000行)上尝试此操作时,它会出现内存错误,对于400行,我使用apply得到8.17ms,使用lookup得到3.05ms,因此我希望lookup能够更好地扩展。由于语法更简单,lookup可能更可取,但两者都能很好地工作,thx伙计们!你能解释一下这段代码是如何工作的吗?@3kstc基本上我们使用
apply
通过传递arg
axis=1
来迭代行,因此这里的lambda是第一行,因此对于第一行
x
是第一行,然后,我们返回一个特定的列,在本例中,该列将是
best
的值。要索引该行注意,在函数获取一行并返回一个值的情况下,不需要lambda:df['value']=df.apply(lookup,axis=1)