Python 基于其他列在pandas中创建新列,其中每个单元格都是numpy.ndarray
我想从欧拉角计算四元数。然后我想把整个四元数值存储在一列中。四元数是numpy.ndarray 我发现类似的问题,但在所有解决方案中,列存储1D值 这是我的代码:Python 基于其他列在pandas中创建新列,其中每个单元格都是numpy.ndarray,python,pandas,numpy,Python,Pandas,Numpy,我想从欧拉角计算四元数。然后我想把整个四元数值存储在一列中。四元数是numpy.ndarray 我发现类似的问题,但在所有解决方案中,列存储1D值 这是我的代码: import transforms3d def computeQuat(p,y,r,syscoord): return transforms3d.euler.euler2quat(p, y, r, syscoord) dataClassic['Quaternion'] = (dataClassic.apply(lambda
import transforms3d
def computeQuat(p,y,r,syscoord):
return transforms3d.euler.euler2quat(p, y, r, syscoord)
dataClassic['Quaternion'] = (dataClassic.apply(lambda x: computeQuat(x['Pitch_Init'],\
x['Yaw_Init'],\
x['Roll_Init'], 'rxyz'), axis=1))
我得到了错误:传递值的形状是(362,4),索引暗示(362,6)
如果我更改函数computeQuat,使其返回一个值,则它可以正常工作:
def computeQuat(p,y,r,syscoord):
return transforms3d.euler.euler2quat(p, y, r, syscoord)[0]
但我想将整个四元数存储在一列中,作为numpy.ndarray。谢谢你的帮助
我使用Python2
我的数据框中的一些行:
Pitch_Init Yaw_Init Roll_Init X Y Z
0 0.00000 0.000000 0.000000 0.00000 0.00000 0.0000
1 -3.02664 -0.196047 0.027153 1.15756 -3.73556 60.8734
2 -3.04845 -0.180832 0.024738 1.16244 -3.75089 60.9885
3 -3.06983 -0.168351 0.022593 1.16580 -3.76106 61.0987
4 -3.12110 -0.135368 0.021681 1.18352 -3.78380 61.4627
5 3.11304 -0.130364 0.019365 1.17835 -3.77255 61.5189
6 3.09046 -0.137977 0.017496 1.17643 -3.76929 61.4626
7 3.08333 -0.132229 0.017267 1.17355 -3.76809 61.4604
8 3.07844 -0.141410 0.017119 1.17351 -3.76710 61.4747
9 3.09239 -0.106203 0.018702 1.19171 -3.77195 61.5361
10 3.08501 -0.125604 0.017750 1.19317 -3.76052 61.4881
新答案:
def computeQuat(row):
quat = (row['Pitch_Init'], row['Yaw_Init'], row['Roll_Init'], 'rxyz')
return transforms3d.euler.euler2quat(*quat)
df['q0'] = 0
df['q1'] = 0
df['q2'] = 0
df['q3'] = 0
for row_num, row in df.iterrows():
quat_res = computeQuat(row)
df.loc[row_num, 'q0'] = quat_res[0]
df.loc[row_num, 'q1'] = quat_res[1]
df.loc[row_num, 'q2'] = quat_res[2]
df.loc[row_num, 'q3'] = quat_res[3]
这不是最漂亮的解决方案,但它很有效。我尝试了你的解决方案,它给出了:('euler2quat()至少接受3个参数(1个给定)',u'发生在索引0')哦,对不起,我正在更正我的答案-现在应该是正确的。现在,我得到:ValueError:传递值的形状是(362,4),索引暗示(362,6)transforms3d.euler.euler2quat(*quat)应该每行返回一个值还是多个值?如果有多个,请尝试将它们返回到新的数据帧,并将其连接到旧的数据帧。告诉我它是否有效。transforms3d.euler.euler2quat返回大小为4的numpy.ndarray我尝试过:dNew=pd.DataFrame()dNew['Quaternion']=dataClassic.apply(computeQuat,axis=1),我得到了相同的错误,dataClassic.apply似乎不想返回大小为4的numpy.ndarray列