Python 将一列值替换为熊猫中的一列向量

Python 将一列值替换为熊猫中的一列向量,python,arrays,pandas,dataframe,Python,Arrays,Pandas,Dataframe,我正在使用python在数据帧中组织一些度量值。 其中一列是我想在2D向量中转换的值,假设该列包含这样的值: col1 25 12 14 21 我希望此列的值逐个更改(在for循环中): 使列col1变为: col1 [-1. 21.] [-1. -2.] [-15. 54.] [11. 2.] 这些值只是示例,函数convert2Vector()将角度转换为二维向量 我写的for-循环不起作用。。我得到一个错误: ValueError: setting an array

我正在使用python在数据帧中组织一些度量值。 其中一列是我想在2D向量中转换的值,假设该列包含这样的值:

 col1
 25
 12
 14
 21
我希望此列的值逐个更改(在for循环中):

使列
col1
变为:

 col1
 [-1. 21.]
 [-1. -2.]
 [-15. 54.]
 [11. 2.]
这些值只是示例,函数
convert2Vector()
将角度转换为二维向量

我写的
for
-循环不起作用。。我得到一个错误:

ValueError: setting an array element with a sequence. 
我能理解


所以问题是:如何做到这一点

这个例外是因为您希望在存储
int
的列(
array
)中插入
列表或
array
)。Pandas和NumPy中的数组
s不能有“参差不齐的形状”,因此不能在一行中有2个元素,在所有其他行中有1个元素(可能有遮罩的情况除外)

要使其工作,您需要存储“常规”对象。例如:

import pandas as pd

df = pd.DataFrame({'col1' : [25, 12, 14, 21]})
df.col1[0] = [1, 2]
# ValueError: setting an array element with a sequence. 
但这是可行的:

>>> df.col1 = df.col1.astype(object)
>>> df.col1[0] = [1, 2]
>>> df
     col1
0  [1, 2]
1      12
2      14
3      21
注意:我不建议这样做,因为
object
列比特定类型的列慢得多。但是,由于使用
for
循环对列进行迭代,因此似乎不需要性能,因此也可以使用
对象
数组


如果您想快速实现,您应该做的是将
convert2vector
函数矢量化,并将结果分配给两列:

import pandas as pd
import numpy as np

def convert2Vector(angle):
    """I don't know what your function does so this is just something that
    calculates the sin and cos of the input..."""
    ret = np.zeros((angle.size, 2), dtype=float)
    ret[:, 0] = np.sin(angle)
    ret[:, 1] = np.cos(angle)
    return ret

>>> df = pd.DataFrame({'col1' : [25, 12, 14, 21]})
>>> df['col2'] = [0]*len(df)
>>> df[['col1', 'col2']] = convert2Vector(df.col1)
>>> df
       col1      col2
0 -0.132352  0.991203
1 -0.536573  0.843854
2  0.990607  0.136737
3  0.836656 -0.547729

您应该调用一个一阶函数,如
df.apply
df.transform
,该函数创建一个新列,然后重新分配:

In [1022]: df.col1.apply(lambda x: [x, x // 2])
Out[1022]: 
0    [25, 12]
1     [12, 6]
2     [14, 7]
3    [21, 10]
Name: col1, dtype: object 
在您的情况下,您将执行以下操作:

df['col1'] = df.col1.apply(convert2vector)

系列上应用
for
循环一样慢。在这种情况下,它甚至更慢,因为它有一个间接层(lambda
)。但这仍然是一个很好的答案,只需要再澄清一点。:)@我真是太蠢了。不需要lambda!我不是这个意思<代码>在
系列上应用
只是一种更好的隐藏反模式。但是没有lambda会更好一些:D@MSeifert啊,对。当你这样说的时候,谢谢!那么,为了将向量的元素用作实数,我需要再次转换它们吗?@BenJo你是说在第二种情况下还是第一种情况下?第二种情况很简单:只需在需要第一项的地方使用
col1
,在需要第二项的地方使用
col2
。如果您讨论的是第一种情况,那么可以使用
np.array(df.col1)
将其转换为
rows x 2
array:)2列解决方案的问题是,我必须在定义了列数的数据库中导入数据帧,以便第一种解决方案更适合。特别是如果我仍然可以访问向量的元素作为实数numbers@BenJo这也在一定程度上取决于数据库。您需要避免将任何内容存储为字符串(这样转换为数字会有点烦人)。但如果它能存储数字列表,那么你就没事了。
df['col1'] = df.col1.apply(convert2vector)