7

パンダにシリーズ A とシリーズ B の 2 つのシリーズがあるとします。これらの値をすべて乗算するデータフレームを作成するにはどうすればよいですか。つまり、シリーズ A を左側に、シリーズ B を上部に配置します。基本的にこれと同じ概念で、系列 A は左側の黄色、系列 B は上部の黄色であり、その間のすべての値は乗算によって埋められます。

http://www.google.co.uk/imgres?imgurl=http://www.vaughns-1-pagers.com/computer/multiplication-tables/times-table-12x12.gif&imgreurl=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 つのシリーズの長さが同じではないことを追加する必要があります。「行列が整列していません」というエラーが表示されるようになったので、それが問題だと思います。

4

5 に答える 5

5

行列乗算ドットを使用できますが、Series を DataFrame に変換する前に ( Series の dot メソッドは dot product を実装するため):

>>> 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
于 2013-10-24T16:26:03.457 に答える
2

最初に 1 の DataFrame を作成します。次に、各軸に沿って順番に乗算をブロードキャストします。

>>> 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 の間で乗算を行うデフォルトの方法であるためです。

于 2015-04-16T22:00:36.567 に答える
1

したがって、長さの異なる2つのシリーズがある場合、これでほとんどの方法が得られると思います. これは非常に手動のプロセスのように思えますが、パンダや NumPy 関数を使用する別の方法は考えられません。

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

最初にの値aを DataFrame に変換し、この Series のコピーを、seriesの値と同じ数の新しいの形式で作成します。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

b次に、 DataFrame を介してシリーズをブロードキャストできresultます。

>>>> 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
于 2014-12-15T21:56:39.817 に答える