使用套用功能Dataframe

时间:2019-09-25 00:50:13

标签: python-3.x pandas math apply

我需要帮助来纠正我遇到的错误。

我有以下数据框:

x = [-0.75853, -0.75853, -0.75853, -0.75852]
y = [-0.63435, -0.63434, -0.63435, -0.63436]
z = [-0.10488, -0.10490, -0.10492, -0.10495]
w = [-0.10597, -0.10597, -0.10597, -0.10596]

df = pd.DataFrame([x, y, z, w], columns=['x', 'y', 'z', 'w'])

我创建了以下功能:

import math
def roll(qw, qx, qy, qz):
    # x-axis rotation
    sinr_cosp = +2.0 * (qw * qx + qy + qz)
    cosr_cosp = +1.0 - 2.0 * (qx * qx + qy * qy)
    roll = math.atan2(sinr_cosp, cosr_cosp)
    return roll

def pitch(qw, qx, qy, qz):
    # y-axis rotation
    sinp = +2.0 * (qw * qy - qz * qx)
    if(math.fabs(sinp) >= 1):
        pitch = copysign(M_PI/2, sinp)
    else:
        pitch = math.asin(sinp)
    return sinp

def yaw(qw, qx, qy, qz):
    # z-axis rotation
    siny_cosp = +2.0 * (qw * qz + qx * qy)
    cosy_cosp = +1.0 - 2.0 * (qy * qy + qz * qz)
    yaw = math.atan2(siny_cosp, cosy_cosp)
    return yaw

最后,使用Pandas apply函数,我尝试将结果与新列关联:

q_w = df['w']
q_x = df['x']
q_y = df['y']
q_z = df['z']

df['row'] = df.apply(roll(q_w, q_x, q_y, q_z))

使用其他功能时也会发生相同的错误。

我在堆栈上看到了一个问题,该问题已使用Numpy修复。我相信这不可能,因为我正在使用特定于Math包的函数。

  

TypeError跟踪(最近的呼叫   最后)/usr/local/lib/python3.6/dist-packages/pandas/core/series.py   包装器(个体)        92引发TypeError(“无法将系列转换为”   ---> 93“ {0}”。format(str(converter)))        94

     

TypeError:无法将系列转换为

     

上述异常是以下异常的直接原因:

     

SystemError跟踪(最近的呼叫   最后)()中的4帧   ----> 1 df ['row'] = df.apply(roll(q_w,q_x,q_y,q_z))

     

in roll(qw,qx,qy,qz)         4 sinr_cosp = +2.0 *(qw * qx + qy + qz)         5 cosr_cosp = +1.0-2.0 *(qx * qx + qy * qy)   ----> 6卷= math.atan2(sinr_cosp,cosr_cosp)         7回滚         8

     

/usr/local/lib/python3.6/dist-packages/pandas/core/series.py在   包装器(个体)        88        89 def包装器(自己):   ---> 90,如果len(self)== 1:        91返回转换器(self.iloc [0])        92引发TypeError(“无法将系列转换为”

     

/usr/local/lib/python3.6/dist-packages/pandas/core/series.py在    len (个体经营)       593返回系列的长度。       594“”“   -> 595 return len(self._data)       596       597 def view(self,dtype = None):

     

/usr/local/lib/python3.6/dist-packages/pandas/core/internals/managers.py   在 len (自己)       290       291 def len (自己):   -> 292 return len(self.items)       293       294 def unicode (自己):

     

SystemError:PyEval_EvalFrameEx返回了带有错误集的结果

2 个答案:

答案 0 :(得分:4)

您应该像

一样使用apply
df.apply(lambda x : roll(x['w'],x['x'],x['y'],x['z']),1)
Out[291]: 
0   -2.175472
1   -1.909103
2   -0.394163
3   -0.397885
dtype: float64

答案 1 :(得分:1)

您还可以修改功能。

def roll(df):
    # x-axis rotation
    sinr_cosp = +2.0 * (df.w * df.x + df.y + df.z)
    cosr_cosp = +1.0 - 2.0 * (df.x * df.x + df.y * df.y)
    roll = math.atan2(sinr_cosp, cosr_cosp)
    return roll

df.apply(roll, axis=1)

出局:

0   -2.175472
1   -1.909103
2   -0.394163
3   -0.397885
dtype: float64