Python 基于其他列在pandas中创建新列,其中每个单元格都是numpy.ndarray

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

我想从欧拉角计算四元数。然后我想把整个四元数值存储在一列中。四元数是numpy.ndarray

我发现类似的问题,但在所有解决方案中,列存储1D值

这是我的代码:

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列