2017-08-25 10 views
0

私はPythonのパンダを使ってDataFrameの測定値を整理しています。値の列をパンダのベクトルの列に置き換えてください

col1 
25 
12 
14 
21 

私はこの列の値が1ずつ変更したい(中:列の 一つは、私は、2Dベクトルに変換する値はそれほどの列は、このような値が含まれているとしましょうです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ベクトルに変換します。

ValueError: setting an array element with a sequence. 

私は理解することができます:私はそれが動作しません書いfor -loopで

は..私はエラーを取得します。

質問は次のとおりです。

答えて

0

例外は、またはarrayintが格納されている列(array)に挿入することに由来します。そしてarrayのPandasとNumPyには、 "不揃いの形"がありません。したがって、1つの行に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ループで列を反復しているので、パフォーマンスが必要ないと思われるので、object配列を使用することもできます。

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第2の場合または第1の場合を意味しますか?後者の場合は簡単です:最初の項目が必要な場所では 'col1'を使用し、2番目の項目が必要な場所では' col2'を使用してください。あなたが最初のケースについて話していたら、 'np.array(df。 – MSeifert

+0

2カラムの解決策の問題は、定義された数の列を持つデータベースでデータフレームをインポートして、最初の解決策がよりよく適合するようにすることです。特にベクトルの要素に実数としてアクセスできる場合は特に –

1

は、あなたが作成しdf.applyまたはdf.transformのような一次関数を呼び出す必要があります:あなたはそれが速いconvert2vector機能をベクトル化し、2列に結果を割り当てているしたい場合は、やるべきことは何


あなたが戻っ割り当てる新しい列:あなたのケースでは

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

''シリーズ 'に' apply'は 'for'-loopと同じくらい遅いです。この場合、間接的なレイヤー( 'lambda')があるので、さらに遅くなります。しかし、まだ良い答えは、ちょっとだけ説明が必要です。 :) – MSeifert

+0

@MSeifertそれは私のばかだった。ラムダは必要ありません! –

+0

それは私が意味するものではありませんでした。 'Series'に' apply'を適用すると、より良い隠し反パターンになります。しかし、ラムダなしで少し良いです:D – MSeifert

関連する問題