我有一个multiIndexed数据框,我想在其中使用另一列的信息将函数应用于一列。这是一些示例数据:
ind pos log
x y z
33.0 7.0 0.0 21 (997.232, 217.786, 26.6823) [1, 0, 0]
0.0 22 (992.761, 217.274, 26.6758) [1, 0, 0]
0.0 23 (998.916, 217.354, 27.9557) [1, 0, 0]
2.0 33.0 2.0 63 (66.6064, 999.717, 70.8408) [0, 1, 0]
2.0 64 (65.7294, 999.793, 72.4056) [0, 1, 0]
我要应用该功能
pos - 1000*log
到数据帧的每一行。最好的方法是什么?
答案 0 :(得分:3)
请勿使用apply
,如其他答案所示。相反,您应该将这些列提取为新的DataFrame,然后对其进行矢量化运算。
i = pd.DataFrame(df['pos'].tolist())
j = pd.DataFrame(df['log'].tolist())
...或者您也可以使用numpy数组执行相同的操作:
i = np.array(df['pos'].tolist())
j = np.array(df['log'].tolist())
df['result'] = (i - 1000 * j).tolist()
请注意,请考虑将列表/可迭代对象的每一列分为一个标量值的多个列。性能很重要,并且使用对象列会最终导致性能下降,除非您使用技巧(如本文中的技巧),否则将使用根本无法扩展的慢循环应用功能。
答案 1 :(得分:1)
将zip
与for循环一起使用
[(np.array(x)-1000*np.array(y)).tolist() for x , y in zip(df.log,df.pos)]
Out[474]: [[-997231.0, -217786.0, -26682.300000000003], [-992760.0, -217274.0, -26675.8]]
答案 2 :(得分:0)
def pos_minus_log(row):
return tuple([row.pos[i] - 1000*row.log[i] for i in range(3)])
然后:df['new_col'] = df.apply(pos_minus_log, axis = 1)
答案 3 :(得分:0)
您可以在一行中写:
df["res"] = df.apply(lambda row: tuple(np.subtract(list(row.pos),[e*1000 for e in row.log] )),axis = 1)
这将添加一列,用于存储每一行的结果。