1

私は例えば2つのデータフレーム、持っている:放送乗算

df1 = pn.DataFrame(np.arange(6).reshape(3, 2), columns=['A1', 'B1']) 
df2 = pn.DataFrame(np.arange(1,7).reshape(3, 2), columns=['A2', 'B2']) 

    A1 B1 
0 0 1 
1 2 3 
2 4 5 

    A2 B2 
0 1 2 
1 3 4 
2 5 6 

私は以下の結果とデータフレームを取得するには、列でDF1とDF2掛ける必要があります。

A1*A2 A1*B2 B1*A2 B1*B2 
0  0  0  1  2 
1  6  8  9  12 
2 20  24  25  30 

DF1のサイズを実際のタスクのdf2は(1000列×90 000行)です。

これらのデータフレームの列をまたいだ「for」サイクルを2回使用することは望ましくありません。

組み込み関数やそれを簡単に計算する方法はありますか?

あなたがシリーズでdfを乗算し、このような結果のデータフレームCONCATする)(df.multiply使用することができます
+0

異なるデータフレームの列を持つ多項式のように見えますが、単一のデータフレームの列はありません – Somnambula

答えて

0

使用broadcasting効率的なためパフォーマンスゲイン:

import itertools 

df = pd.DataFrame((df1.values[..., None] * df2.values[:, None]).reshape(df1.shape[0],-1)) 
df.columns = ["*".join(i) for i in itertools.product(*[df1.columns, df2.columns])] 

enter image description here


df1.values[..., None]を組み込む目的は、df1.valuesの以前(3, 2)形状から右有する形状(3, 2, 1)に余分次元を作成することです。

さらに、df2.values[:, None]は、乗算プロセスを助けるために、から(3, 1, 2)になるように中心軸に向かって余分な次元を追加します。

最後に、reshapeそれら(挙げ質問に同じ形状を共有する両方のためdf2
を元df1のものと同じ行数をとる(OR)します。

+1

Excellent!私は本当に好きです)) Pythonは私のための新しいプログラミング言語であるため、Pythonのデータを使って作業の概念を変更するには時間が必要です。ありがとう!!! – Somnambula

+0

この段階で放送の利用が圧倒されているようであれば、私は[この投稿](http://scipy.github.io/old-wiki/pages/EricsBroadcastingDoc)にこれらの概念を理解するのに良い読んだりすることをお勧めします。 –

0

df3 = pd.concat([df1[["A1", "B1"]].multiply(df2["A2"], axis="index"), 
df1[["A1", "B1"]].multiply(df2["B2"], axis="index")], axis = 1) 

df3.columns = ['A1*A2', "B1*A2", "A1*B2", "B1*B2"] 

あなたが得る:

 A1*A2 B1*A2 A1*B2 B1*B2 
0  0  1  0  2 
1  6  9  8  12 
2  20  25  24  30 
+0

ありがとうございます! あなたのソリューションはJava Developerとして機能し、より明確になります – Somnambula