2017-06-09 8 views
2

データフレームの行を別のデータフレーム内の同じインデックス行で分割しようとしています。各データフレームには同じ量の列があります。インデックス別のデータフレームでデータフレームを分割する

目的は、列のリストを別の列のリストで除算することです。 パンダでこれを行う方法はありますか?ここで

はサンプルデータです:

import pandas as pd 
import numpy as np 
data1 = {"a":[10.,20.,30.,40.,50.], 
     "b":[900.,800.,700.,600.,500.], 
     "c":[2.,4.,6.,8.,10.]} 
data2 = {"f":[1.,2.,3.,4.], 
     "g":[900.,800.,700.,600.], 
     "h":[10.,20.,30.,40.]} 
df1 = pd.DataFrame(data1) 
df2 = pd.DataFrame(data2) 

予想される出力:

今のよう
a/f b/g c/h 
0 10.0 1.0 0.2 
1 10.0 1.0 0.2 
2 10.0 1.0 0.2 
3 10.0 1.0 0.2 
4 NaN NaN NaN 

、私は私が書いたこの小さな機能を使用しています:

def divDF(df1, df2): 
    nRow, nCol = df1.shape 
    result = pd.DataFrame(np.empty((nRow, nCol)), index=df1.index) 
    for col in range(nCol): 
     result.iloc[:,col] = df1.iloc[:,col]/df2.iloc[:,col] 
    return result 

はです。この唯一の方法かこれを行うより速い方法がありますか?

答えて

2

Pandasは本質的なデータ配置を行います。したがって、Pandasは両方のデータファイルで行インデックスと列に同じラベルを付けると、期待通りに動作します。

あなたは次のように新しい名前に辞書マッピング古い列名と共通名に、あなたの列の名前を変更する必要があります。

rn_df1 = dict(list(zip(df1.columns.values,(df1.columns+'/'+df2.columns)))) 
rn_df2 = dict(list(zip(df2.columns.values,(df1.columns+'/'+df2.columns)))) 
df1.rename(columns=rn_df1).div(df2.rename(columns=rn_df2)) 

出力:インデックス・アラインメントを回避する値で

a/f b/g c/h 
0 10.0 1.0 0.2 
1 10.0 1.0 0.2 
2 10.0 1.0 0.2 
3 10.0 1.0 0.2 
3

除算を

dfd = df1.div(df2.values) 
dfd.columns = df1.columns + '/' + df2.columns 

dfd 

    a/f b/g c/h 
0 10.0 1.0 0.2 
1 10.0 1.0 0.2 
2 10.0 1.0 0.2 
3 10.0 1.0 0.2 

または

c = df1.columns + '/' + df2.columns 
pd.DataFrame(df1.values/df2.values, df1.index, c) 

    a/f b/g c/h 
0 10.0 1.0 0.2 
1 10.0 1.0 0.2 
2 10.0 1.0 0.2 
3 10.0 1.0 0.2 

ScottBostonの答えインデックスアライメントを強制的にalignを使用し

c = df1.columns + '/' + df2.columns 
d1 = dict(zip(df1.columns, c)) 
d2 = dict(zip(df2.columns, c)) 
df1.rename(columns=d1)/df2.rename(columns=d2) 

    a/f b/g c/h 
0 10.0 1.0 0.2 
1 10.0 1.0 0.2 
2 10.0 1.0 0.2 
3 10.0 1.0 0.2 
4 NaN NaN NaN 
+1

時々、私は単にオーバーだと思いますいくつかの解決策。ニースpiRSquared。 –

+0

@ScottBostonは私を信じています...そうです..私は! – piRSquared

+0

サンプルデータを更新しました。これは異なる量の索引で動作しますか? – Oligg

3

@の復活:結果の出力

df3 = np.divide(*df1.align(df2, axis=0)) 
df3.columns = df1.columns + '/' + df2.columns 

a/f b/g c/h 
0 10.0 1.0 0.2 
1 10.0 1.0 0.2 
2 10.0 1.0 0.2 
3 10.0 1.0 0.2 
4 NaN NaN NaN 
+0

これは本当に 'align'のスマートな使い方です – piRSquared

+0

このメソッドは、より大きいデータフレーム(20k行、1kカラムでテスト)では遅くなりますが、小さなデータフレーム – Oligg

関連する問題