web-dev-qa-db-ja.com

パンダ:2つのデータフレームの要素ごとの乗算

2つのPandasデータフレーム間の要素ごとの乗算を行う方法を知っています。ただし、2つのデータフレームの次元に互換性がない場合、事態はより複雑になります。たとえば、_df * df2_ 、しかし_df * df3_は問題です:

_df = pd.DataFrame({'col1' : [1.0] * 5, 
                   'col2' : [2.0] * 5, 
                   'col3' : [3.0] * 5 }, index = range(1,6),)
df2 = pd.DataFrame({'col1' : [10.0] * 5, 
                    'col2' : [100.0] * 5, 
                    'col3' : [1000.0] * 5 }, index = range(1,6),)
df3 = pd.DataFrame({'col1' : [0.1] * 5}, index = range(1,6),)

df.mul(df2, 1) # element by element multiplication no problems

df.mul(df3, 1) # df(row*col) is not equal to df3(row*col)
   col1  col2  col3
1   0.1   NaN   NaN
2   0.1   NaN   NaN
3   0.1   NaN   NaN
4   0.1   NaN   NaN
5   0.1   NaN   NaN
_

上記の状況では、dfのすべての列にdf3.col1を乗算するにはどうすればよいですか

私の試み: _df3.col1_ len(df.columns.values)回複製して、dfと同じ次元のデータフレームを取得しようとしました。

_df3 = pd.DataFrame([df3.col1 for n in range(len(df.columns.values)) ])
df3
        1    2    3    4    5
col1  0.1  0.1  0.1  0.1  0.1
col1  0.1  0.1  0.1  0.1  0.1
col1  0.1  0.1  0.1  0.1  0.1
_

しかし、これは次元3 * 5のデータフレームを作成しますが、私は5 * 3の後です。私は必要なものを得るためにdf3.T()で転置できることを知っていますが、これはそんなに速い方法ではないと思います。

16
Zhubarb
In [161]: pd.DataFrame(df.values*df2.values, columns=df.columns, index=df.index)
Out[161]: 
   col1  col2  col3
1    10   200  3000
2    10   200  3000
3    10   200  3000
4    10   200  3000
5    10   200  3000
28
unutbu

これを行う簡単な方法は、次のように、colnameを保持するデータフレームに他の値(つまり、numpy配列)を掛けることです。

In [63]: df * df2.values
Out[63]: 
   col1  col2  col3
1    10   200  3000
2    10   200  3000
3    10   200  3000
4    10   200  3000
5    10   200  3000

このように、新しいデータフレームボイラープレートをすべて記述する必要はありません。

10
The Unfun Cat

これは私のために働く:

mul = df.mul(df3.c, axis=0)

または、代わりに減算(除算)する場合:

sub = df.sub(df3.c, axis=0)
div = df.div(df3.c, axis=0)

Dfのnanでも機能します(たとえば、これをdfに適用する場合:df.iloc[0]['col2'] = np.nan)

3

Pandasブロードキャストプロパティ)を利用するには、 multiply を使用できます。

df.multiply(df3['col1'], axis=0)
2
Amirhos Imani

別の方法は、列のリストを作成して結合することです:

cols = [pd.DataFrame(df[col] * df3.col1, columns=[col]) for col in df]
mul = cols[0].join(cols[1:])
1
Andrey Shokhin