2016-04-08 3 views
2

私は2頭のパンダシリーズを持って、別のインデックスを持つ各:私がやりたい何異なるインデックスのパンダシリーズをブロードキャストする方法は?

In [2]: a = pd.Series(range(5), index=pd.Index(list('abcde'), name='index')) 
In [3]: b = pd.Series(range(4), index=pd.Index(list('ABCD'), name='BIG_INDEX')) 

がufuncを実行する前に、1つの軸に沿ってBをブロードキャストするパンダを指示するa.mul(b, axis=1)の線に沿って何かである(たとえば、乗算する、等の力を上げるなど)。 applyを使うよりも、これを行う良い方法はありますか?

In [4]: a.apply(lambda x: x*b) 
Out[4]: 
BIG_INDEX A B C D 
index 
a   0 0 0 0 
b   0 1 2 3 
c   0 2 4 6 
d   0 3 6 9 
e   0 4 8 12 

答えて

3

abが配列であるかのようにあなたは計算を実行するためにnumpy.outerを使用することができます。

In [285]: pd.DataFrame(np.outer(a, b), columns=b.index, index=a.index) 
Out[285]: 
BIG_INDEX A B C D 
index     
a   0 0 0 0 
b   0 1 2 3 
c   0 2 4 6 
d   0 3 6 9 
e   0 4 8 12 

これはa.apply(lambda x: x*b)を呼び出すよりも高速です。ところで


、すべてのnumpyののufuncs come with 5 methodsouteraccumulatereducereduceat、およびat。したがって、上記のソリューションを書くための別の方法は

In [34]: pd.DataFrame(np.multiply.outer(a, b), columns=b.index, index=a.index) 
Out[36]: 
BIG_INDEX A B C D 
index     
a   0 0 0 0 
b   0 1 2 3 
c   0 2 4 6 
d   0 3 6 9 
e   0 4 8 12 

されており、このように書かれたとき、どんなnumpyのufuncに同じ考え方を適用する方法は明らかです。例えば、作るとabのうち加算テーブルは、np.addouterメソッドを呼び出す:

In [37]: pd.DataFrame(np.add.outer(a, b), columns=b.index, index=a.index) 
Out[37]: 
BIG_INDEX A B C D 
index     
a   0 1 2 3 
b   1 2 3 4 
c   2 3 4 5 
d   3 4 5 6 
e   4 5 6 7 
+0

申し訳ありません - 私はスーパー明確ではありませんでした。この問題の一般的な解決策があるかどうか、特に2つの引数をとるufunc(たとえば、mul、div、add、sub、powなど)があるかどうかを知りたい。本質的に問題は、(4x1)行列と(1x5)行列のように、numpy行列を使って計算を行うと、これらの操作を実行でき、ブロードキャストが自動的に処理されることです。しかし、サイズ(4、5)のシリーズでは、最初に数値をnumpy形式に変換しなければ、不一致を処理できません。これはどうですか? – delgadom

+1

一般的に、Pandasの操作は、NDFrameのインデックスに対して** align **を試みます。上記のような熟考している操作では、Seriesインデックスを無視し、NumPyの場合と同じように*値*をブロードキャストします。それはパンダのためのものではありません。データをインデックスレス配列として扱いたい場合はいつでも、NumPy not Pandasを使用してください。 – unutbu

+0

私は本当にインデックスを無視したくない...私は新しいインデックスに沿って放送中にそれらを維持したい。しかし、あなたのメソッドの抽象化を使用することが最善の方法であると思われます。たとえば、 'outer_opr = lambda x、y、opr:pd.DataFrame(opr(x.values.reshape((len(x)、1)) 、y.values.reshape((1、len(y))))、index = x.index、columns = y.index) ' – delgadom

関連する問題