我有以下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 2
1992 d 12
1993 a 5
所以我希望通过使用列名来查找基于另一个行值的值。例如,第二个df中1990的值应该从第一个df中查找“a”,第二个行应该从第一个df中查找“c”(= 2)。
有什么想法吗?
答案 0 :(得分:12)
有一个内置的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 :(得分: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
答案 2 :(得分:1)
您可以使用np.where
进行此操作,如下所示。我认为这样会更有效
import numpy as np
import pandas as pd
df = pd.DataFrame([['1990', 'a', 5, 4, 7, 2], ['1991', 'c', 10, 1, 2, 0], ['1992', 'd', 2, 1, 4, 12], ['1993', 'a', 5, 8, 11, 6]], columns=('Date', 'best', 'a', 'b', 'c', 'd'))
arr = df.best.values
cols = df.columns[2:]
for col in cols:
arr2 = df[col].values
arr = np.where(arr==col, arr2, arr)
df.drop(columns=cols, inplace=True)
df["values"] = arr
df
结果
Date best values
0 1990 a 5
1 1991 c 2
2 1992 d 12
3 1993 a 5