不依赖于循环数据帧的每一行(对于大型数据集来说可能非常慢),如何使用连续两列的计算结果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
来实现,但我想要一个更通用的解决方案,可以扩展到数据不适合转置的情况。
答案 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