2013-10-24 19 views
5

パンダ、シリーズA、シリーズBに2つのシリーズがあるとします。これらのすべての値を掛け合わせたデータフレームを作成するにはどうすればいいですか?手の側とシリーズBの上に沿って。シリーズAの上部に黄色B左と、一連の黄色になり、そしてその間のすべての値が乗算によって満たされることになる。このように基本的には同じ概念、:2つのシリーズを掛け合わせてパンダにデータフレームを作成する

http://www.google.co.uk/imgres?imgurl=http://www.vaughns-1-pagers.com/computer/multiplication-tables/times-table-12x12.gif&imgrefurl=http://www.vaughns-1-pagers.com/computer/multiplication-tables.htm&h=533&w=720&sz=58&tbnid=9B8R_kpUloA4NM:&tbnh=90&tbnw=122&zoom=1&usg=__meqZT9kIAMJ5b8BenRzF0l-CUqY=&docid=j9BT8tUCNtg--M&sa=X&ei=bkBpUpOWOI2p0AWYnIHwBQ&ved=0CE0Q9QEwBg

申し訳ありませんが、おそらく私の2つのシリーズは同じ長さではないと付け加えなければならないでしょう。私は今、「行列が整列していない」というエラーが出ているので、それが問題だと思います。

+0

これまでに何を試みましたか?質問を編集したり、コードやエラーや結果を追加することができます。 – Theresa

答えて

2

dot method on Series implements dot productので)あなたは行列乗算のドットを使用することができますが、データフレームにシリーズを変換する必要があります前に:だから私はあなたがの2つのシリーズを持っている場合、これはあなたが道のほとんどを得るかもしれないと思う

>>> B = pd.Series(range(1, 5)) 
>>> A = pd.Series(range(1, 5)) 
>>> dfA = pd.DataFrame(A) 
>>> dfB = pd.DataFrame(B) 
>>> dfA.dot(dfB.T) 
    0 1 2 3 
0 1 2 3 4 
1 2 4 6 8 
2 3 6 9 12 
3 4 8 12 16 
0

異なる長さ。これは非常に手作業のようですが、pandasまたはNumPy関数を使って別の方法を考えることはできません。

>>>> a = Series([1, 3, 3, 5, 5]) 
>>>> b = Series([5, 10]) 

まずDATAFRAMEにごaを変換し、あなたのシリーズbの値を持っているとして、多くの新しいの形で、このシリーズのコピーを作成します。

>>>> result = DataFrame(a) 
>>>> for i in xrange(len(b)): 
      result[i] = a 
    0 1 
0 1 1 
1 3 3 
2 3 3 
3 5 5 
4 5 5 

次に、あなたのDATAFRAME resultの上にシリーズbを放送することができます:私が選択した例では

>>>> result = result.mul(b) 
    0 1 
0 5 10 
1 15 30 
2 15 30 
3 25 50 
4 25 50 

、あなたはあなたの最初のシリーズのために重複しているインデックスで終わるだろう。インデックスを一意の識別子として残すことをお勧めします。これにより、複数の行が割り当てられているインデックスを選択すると、複数の値が返されます。あなたがする必要がある場合は、その後、これらの関数を使用して、行ラベルとあなたの列ラベルのインデックスを再作成することができます:重複インデックスの

>>>> result.columns = b 
>>>> result.set_index(a) 
    5 10 
1 5 10 
3 15 30 
3 15 30 
5 25 50 
5 25 50 

例:

>>>> result.loc[3] 
    5 10 
3 15 30 
3 15 30 
1

第1ののデータフレームを作成します。その後、各軸に沿って順次ブロードキャストを行います。

>>> s1 = Series([1,2,3,4,5]) 
>>> s2 = Series([10,20,30]) 
>>> df = DataFrame(1, index=s1.index, columns=s2.index) 
>>> df 
    0 1 2 
0 1 1 1 
1 1 1 1 
2 1 1 1 
3 1 1 1 
4 1 1 1 
>>>> df.multiply(s1, axis='index') * s2 
    0 1 2 
0 10 20 30 
1 20 40 60 
2 30 60 90 
3 40 80 120 
4 50 100 150 

あなたはシリーズは、行インデックスと整列することを指定するためにdf.multiplyを使用する必要があります。通常の乗算​​演算子*はs2に使用できます。これは、列の一致が、DataFrameとSeries間の乗算を行うデフォルトの方法であるためです。

2

行(または列)の各値を他の系列にブロードキャストすることによって、2つの等しくない長さの系列を掛けてDataFrameを作成できます。例:

> row = pd.Series(np.arange(1, 6), index=np.arange(1, 6)) 
> col = pd.Series(np.arange(1, 4), index=np.arange(1, 4)) 
> row.apply(lambda r: r * col) 
    1 2 3 
1 1 2 3 
2 2 4 6 
3 3 6 9 
4 4 8 12 
5 5 10 15 
関連する問題