2017-12-20 13 views
0

列を一致させることによって2つのdfs間で行分割を実行するのですか?例えば、2dfから行を分割するパンダ

DF1:

Name 1 2 3 5 Total 
----------------------------- 
A  2 2 2 2 8 
B  1 1 1 1 4 
C  0 1 2 3 6 

DF2:

Alias 1 2 3 4 Total 
----------------------------- 
X  5 5 5 5 20 
Y  10 10 0 0 20 
Z  1 2 3 4 10 

結果は次のようになります。

R

NewName 1 2  3  4  5 Total 
----------------------------------------  (These rows will be set manually) 
I  2/5 2/5 2/5 0/5 - 8/20 <---I = A/X 
J  1/5 1/5 1/5 0/5 - 4/20 <---J = B/X 
K  1/10 1/10 -  - - 4/20 <---K = B/Y 
L  0/5 1/5 2/5 0/5 - 6/20 <---L = C/X 

ありがとう! :)

+0

分割が行われた時に対応する行を決定しますか? –

+0

私は手動でそれを制御したいです – TylerNG

+0

これはおそらく質問そのものにあるはずです。 – ASGM

答えて

1

これには解決策が必要ですが、実行することができます。まず、手動で制御されるパラメータを宣言します。

i = ['A', 'B', 'B', 'C'] 
j = ['X', 'X', 'Y', 'X'] 
k = ['I', 'J', 'K', 'L'] 

ここでは、2つのデータフレームを整列させることを考えています。

x = df1.set_index('Name') 
y = df2.set_index('Alias') 

x, y = x.align(y) 

除算を実行して、新しいデータフレームを作成します。数が少ない配列を分割しているので、実行時の警告が出る可能性があります。それらを無視してください。

z = x.reindex(i, axis=0).values/y.reindex(j, axis=0).values 

df = pd.DataFrame(z, index=k, columns=x.columns) 
df 

    1 2   3 4 5 Total 
I 0.4 0.4 0.400000 NaN NaN 0.4 
J 0.2 0.2 0.200000 NaN NaN 0.2 
K 0.1 0.1  inf NaN NaN 0.2 
L 0.0 0.2 0.400000 NaN NaN 0.3 

編集;古いバージョンでは、reindexaxisパラメータを受け入れません。それはより多くのあなたが望んでいた出力のように見えるようにするために、次に

df[np.isfinite(df)].fillna('-') 

    1 2 3 4 5 Total 
I 0.4 0.4 0.4 - - 0.4 
J 0.2 0.2 0.2 - - 0.2 
K 0.1 0.1 - - - 0.2 
L 0.0 0.2 0.4 - - 0.3 
+0

@COLDSPEED columns = c? Cはどこから来たの? 私もこのエラーがあります:TypeError:reindex()は予期しないキーワード引数 "axis"を持っています – TylerNG

+0

@TylerNGおっと、申し訳ありません、それはデバッグの成果物でした。今見てください。 –

+0

@TylerNGそのエラー....あなたは古いバージョンだからです。 'index = j'と' index = i'を使い、軸のパラメータを削除してください。 –

-1

インデックスが気にしないように見えるので、これはうまくいくはずです。

r = df1.reset_index(drop=True)/df2.reset_index(drop=True) 
+0

ありがとうございますが、これは両方のdfsですべての位置が一致する場合に有効です。しかし、私は両方のdfsでいくつかの特定の行で分割する必要があるので、私はしません。 – TylerNG

+1

これは完全に間違っています。 –

+0

なぜあなたはそう言わなかったのですか? –

1
I = df1.T['A']/df2.T['X'] 
J = df1.T['B']/df2.T['X'] 
K = df1.T['B']/df2.T['Y'] 
L = df1.T['C']/df2.T['X'] 

df = pd.concat([I, J, K, L], axis=1).rename(columns={0:'I', 1:'J', 2:'K', 3:'L'}).T 

- その場合は、np.isfiniteを使用し、非有限値を埋めるために、さらに

z = x.reindex(index=i).values/y.reindex(index=j).values 

を使用:

df[np.isfinite(df)].fillna('-') 

-

編集もっと普遍

、カスケードない部門に、あなたが行うことができます:

pairs = [('A','X'), ('B','X'), ('B','Y'), ('C','X')] 
series_to_concat = [df1.T[col_df1]/df2.T[col_df2] for (col_df1, col_df2) in pairs] 
names = ['I', 'J', 'K', 'L'] 
col_names = {col_num : name for col_num, name in enumerate(names)} 

df = pd.concat(series_to_concat, axis=1).rename(columns=col_names).T 
+0

これは、ここに示されているサンプルデータに特有のものです。 –

+0

'( 'A'、 'X')'などのタプルを1つのリストに入れて、より包括的にしたい場合はリストの理解を行うことができます。列が正しく提供されていれば、この答えはどんなsimillarのdfでもうまくいくと思うのは間違っています(もちろん名前も付ける必要がありますが、ここで大きな問題ではありません)。 – jo9k

+0

あなたが好きなようにソリューションを実装することができますが、その目的がシンプルさと読みやすさであれば、目的を破るでしょう;-) –

関連する問題