2016-07-20 3 views
3

は、私はこのように、関数から返された値にデータフレームに列を追加し、その値を更新することができます理解:しかしデータフレーム内の列を反復処理し、2つの新しい列を同時に更新する方法はありますか?

df=pd.DataFrame({'x':[1,2,3,4]}) 

def square(x): 
    return x*x 

df['x_squared'] = [square(i) for i in df['x']] 

、私は実際の関数は、2つのアイテムを返しているという問題に直面しています、これらの2つの項目を2つの異なる新しい列に入れたいと思います。私はより明確に私の問題を記述するために、ここで疑似コードを書いた:

df=pd.DataFrame({'x':[1,2,3,4]}) 

def squareAndCube(x): 
    return x*x, x*x*x 

#below is a pseudo-code 
df['x_squared'], df['x_cubed'] = [squareAndCube(i) for i in df['x']] 

上記のコードは私に「解凍するためにあまりにも多くの値を」というエラーメッセージを与えます。 これをどのように修正する必要がありますか?

答えて

3

あなたがそうのように、ベクトル化の方法で行うことができます - 右に戻るあなたの愚か場合に

df['x_squared'], df['x_cubed'] = squareAndCube(df.x) 

、 - そうのように、

df['x_squared'], df['x_cubed'] = df.x**2,df.x**3 

か、そのカスタム機能付きあなたが持っていた:

In [101]: [squareAndCube(i) for i in df['x']] 
Out[101]: [(1, 1), (4, 8), (9, 27), (16, 64)] 

今、左側にdf['x_squared'], df['x_cubed'] =があります。したがって、すべての行の二乗された数が最初の入力割り当てとして期待されます。上記のリストから、最初の要素はそうではありません、実際は最初の行の正方形と立方体です。したがって、そのリストを「転置」して新しい列として割り当てることが修正されています。したがって、修正は次のようになります - NumPy broadcastingの愛のために

In [102]: L = [squareAndCube(i) for i in df['x']] 

In [103]: map(list, zip(*L)) # Transposed list 
Out[103]: [[1, 4, 9, 16], [1, 8, 27, 64]] 

In [104]: df['x_squared'], df['x_cubed'] = map(list, zip(*L)) 

df['x_squared'], df['x_cubed'] = (df.x.values[:,None]**[2,3]).T 
+0

素晴らしい答え@Divakar、1 – piRSquared

+0

はところで放送は私のlog_dotソリューションよりWAY1 !! 1高速です。 – piRSquared

+0

これは本当に素晴らしい答えです!私はこの 'squareAndCube()'関数を使って問題を解決しました。私の本当の問題は、アドレスを入力として使用して緯度と経度を返す必要があることです。最後に 'map'と' zip'メソッドを選びました。しかし、いくつかの他の方法があることを知ることは本当に素晴らしいことです!ありがとう@Divakar。 – user3768495

0

このようdf.locを使用することについてどのように:

df=pd.DataFrame({'x':[1,2,3,4]}) 

def square(x): 
    return x*x 

df['x_squared'] = df['x_cubed'] = None 
df.loc[:, ['x_squared', 'x_cubed']] = [squareAndCube(i) for i in df['x']] 

が与え

x x_squared x_cubed 
0 1   1  1 
1 2   4  8 
2 3   9  27 
3 4   16  64 

これはあなたが持っていたものに非常に近いですが、列はdf.locが機能するために存在する必要があります。

初心者のために、df.locは、作業する行のリスト(この場合は:)と、列のリスト(['x_squared', 'x_cubed'])の2つのパラメータをとります。

1

これは正の数で機能します。一般化する方法を考えていますが、このソリューションの簡潔さは私の気が散漫です。

df = pd.DataFrame(range(1, 10)) 
a = np.arange(1, 4).reshape(1, -1) 

np.exp(np.log(df).dot(a)) 

enter image description here

+0

これに触発され、放送を使った別のアプローチが追加されました! :) – Divakar

+0

@Divakar私はあなたが知っていることを知っていました:-)私はあなたに助けを求めようとしていましたが、何か他のものに気を取られました。 – piRSquared

関連する問題