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
通过传递argaxis=1
来迭代行,因此这里的lambda是第一行,因此对于第一行x
是第一行,然后,我们返回一个特定的列,在本例中,该列将是best
的值。要索引该行注意,在函数获取一行并返回一个值的情况下,不需要lambda:df['value']=df.apply(lookup,axis=1)