2016-08-31 17 views
2

大きなデータセットがあり、条件を満たす複数の行を使用して畳み込み計算を行いたい。最初に各行のベクトルを計算する必要があります。私はベクトルをデータフレーム列に格納する方が効率的だと思ったので、畳み込みを行うときにforループを避けることができます。問題は、ベクトルは可変長であり、私はそれを行う方法を理解できません。可変サイズの配列をPandasセルに書き込む

は、ここに私のデータの要約です:

Date  State Alloc P 
2012-01-01 AK  3  0.5 
2012-01-01 AL  4  0.3 
… 

各状態が異なるのAllocとP値を持っています。日付と州ごとに行があり、データフレームは15,000行以上あります。各エントリに対して

、私はこのようになりますベクトルたい:私はこのような新しい列を設定する方法を見つけ出すことはできません

[P, np.zeros(Alloc), 1-P] 

を。私は次のような文を試しました:

df['Test'] = [df['P'], np.zeros(df['Alloc'), 1 – df['P']] 

しかし、それらは機能しません。

誰にもアイデアはありますか?

答えて

0

は、だからここに答えがあります。 piRSquaredはほぼ正しいが、それほどではなかった。ここにはいくつかの部分があります。

applyメソッドは部分的に機能します。関数に行が渡され、上記のように計算を行うことができます。問題は、 "ValueError:渡された値の形状が..."というエラーメッセージが表示されることです。返される列の数は、データフレーム内の列の数と一致しません。私の推測は、戻り値がリストであり、Pandasが結果を正しく解釈していないためです。

回避策は、単一の列に適用することです。この単一の列には、P値とAlloc値が含まれている必要があります。ここでの手順は以下のとおりです。

がマージされた列を作成します。

df['temp'] = df[['P','Alloc']].values.tolist() 

関数を記述します。

def array_p(x): return [x[0]] + [0]*int(x[1]) + [1 - x[0]] 

(int型は、前の行が山車を与えるので、私はNPを必要としなかった必要とされています。

df['Array'] = temp['temp'].apply(array_p) 
:ゼロ)

は、関数を適用します

これは機能しますが、明らかに必要以上のステップが必要です。誰かがより良い答えを出すことができれば、私はそれを聞いてみたいです。

1

てみてください☺

ありがとう:

def get_vec(x): 
    return [x.P] + np.zeros(x['Alloc']).tolist() + [1 - x.P] 

df.apply(get_vec, axis=1) 

0   [0.5, 0.0, 0.0, 0.0, 0.5] 
1 [0.3, 0.0, 0.0, 0.0, 0.0, 0.7] 
dtype: object 

df['Test'] = df.apply(get_vec, axis=1) 
df 

enter image description here

+0

私はValueErrorを取得しています:渡された値の形のエラー - 前と同じ –

+0

私は解決策を見つけました。私はもう少しテストをして、それをきれいにしてすぐにここに投稿します。なぜ私は私が得ているエラーメッセージを取得していたのかも知っています。私はすべて私の答えでそれを説明します。 –

関連する問題