2017-08-25 138 views
0

我使用python熊貓在DataFrame中組織一些測量值。 列的一個是我想在2D矢量轉換值,所以我們說,列包含這樣的值:用熊貓中的一列向量替換一列值

col1 
25 
12 
14 
21 

我想有此列的值通過逐個改變(在for循環):

for value in values: 
    df.['col1'][value] = convert2Vector(df.['col1'][value]) 

以使得該柱col1變爲:

col1 
[-1. 21.] 
[-1. -2.] 
[-15. 54.] 
[11. 2.] 

的值僅僅是示例並且函數convert2Vector() CON將角度轉換爲2D向量。

隨着for -loop,我寫這是行不通的。我得到的錯誤:

ValueError: setting an array element with a sequence. 

,我可以理解。

所以問題是:如何做到這一點?

回答

0

這個例外來自於您希望在存儲int s的列(array)中插入listarray這一事實。並且Pandas和NumPy中的array不能有「粗糙的形狀」,因此不能在一行中包含2個元素,而在其他所有其他元素中(除了可能使用掩碼)。

爲了使它工作,你需要存儲「一般」對象。例如:

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循環遍歷Column,所以你不需要性能,所以你也可以使用object數組。


如果你想讓它快是矢量化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 
+0

謝謝!然後爲了使用矢量的元素作爲實數,我需要再次轉換它們嗎? –

+0

@ BenJo你的意思是在第二種情況下還是第一種情況?在第二種情況下很容易:只需在需要第一項的'col1'和需要第二項的'col2'處使用。如果你在談論第一種情況,你可以使用'np.array(df。col1)'將其轉換爲'rows x 2'數組:) – MSeifert

+0

2列解決方案的問題在於,我必須將數據集導入數據庫中,並使用定義的列數,以便第一個解決方案更好。特別是如果我仍然可以作爲實數訪問向量的元素 –

1

你應該叫一次函數像df.applydf.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) 
+0

''應用''系列'就像'for'循環一樣慢。在這種情況下,它更慢,因爲它有一個間接層('lambda')。但仍然是一個很好的答案,只需要更多的澄清。 :) – MSeifert

+0

@ MSeifert這是我的愚蠢。拉姆達不需要! –

+0

這不是我的意思。 「系列」上的「應用」只是一個更好的隱藏反模式。但沒有'lambda'會更好一些:D – MSeifert