根据列数据计算从Pandas DataFrame中的另一行查找数据的最快方法?

时间:2017-08-29 17:49:32

标签: python pandas dataframe mapping

不依赖于循环数据帧的每一行(对于大型数据集来说可能非常慢),如何使用连续两列的计算结果2*A - B来查找列中的值B并从该新行中提取列C中的数据并放入原始行的列D

例如,在下面的DataFrame中,行2的{​​{1}}等于2*A - B。行1中的列B包含0,因此行1中列C的数据应放在行0列中{1}}。

D

生成的DataFrame应如下所示:

2

我假设In [1] import pandas as pd In [2] a = [3,3,3] In [3] b = [1,3,5] In [4] c = [3,4,5] In [5] df1 = pd.DataFrame({'A': a , 'B': b, 'C':c}) Out[5] print(df1) A B C 0 3 1 3 1 3 3 4 2 3 5 5 A B C D 0 3 1 3 5 1 3 3 4 4 2 3 5 5 3 的每个组合只有一个唯一值。虽然上面的示例可以通过简单地将列A转换为列B来实现,但我想要一个更通用的解决方案,可以扩展到数据不适合转置的情况。

2 个答案:

答案 0 :(得分:3)

如果你能保证独特的组合,那么......

mapping = dict(df[['B', 'C']].values)
df['D'] = (2 * df.A - df.B).replace(mapping)
df    
   A  B  C  D
0  3  1  3  5
1  3  3  4  4
2  3  5  5  3

创建B值到C值的映射。执行操作(2 * A - B),并使用之前生成的mapping获取相应的C值。

如果映射不存在,则不替换计算值。如果您希望将其替换为NaN,则可以改为使用map

df['D'] = (2 * df.A - df.B).map(mapping)
df
   A  B  C  D
0  3  1  3  5
1  3  3  4  4
2  3  5  5  3

它的工作方式为df.replace,但非映射的值会替换为NaN

答案 1 :(得分:2)

使用pd.DataFrame.eval

df1.assign(D=df1.eval('2 * A - B').map(df1.set_index('B').C))

   A  B  C  D
0  3  1  3  5
1  3  3  4  4
2  3  5  5  3

但如果你想要快速的话。

m = dict(zip(df1.B.values.tolist(), df1.C.values.tolist()))
a = df1.A.values
b = df1.B.values
z = 2 * a - b

df1.assign(D=[m[i] for i in z.tolist()])

   A  B  C  D
0  3  1  3  5
1  3  3  4  4
2  3  5  5  3