使用熊猫从另一列中减去列表中一列中的值

时间:2018-07-18 15:37:49

标签: python pandas list

我有一个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 

到数据帧的每一行。最好的方法是什么?

4 个答案:

答案 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)

这将添加一列,用于存储每一行​​的结果。