2016-03-28 5 views
1

内のすべての値の列と行(2の2セット)、私はサイズの異なる2つのデータフレームを持っていると私は、4つの異なる列のすべての値の比較を使用したいデータフレーム

を比較すると、基本的に私が見たいのですがここで、df1 ['A'] == df2 ['A'] &ここで、df1 ['B'] == df2 ['B']を返し、df1 ['C']の値にdf2 ['C'] ' sは

import pandas as pd 
df1 = pd.DataFrame({"A": [1, 2, 3, 4, 3], "B": [2, 5, 4, 7, 5], "C": [1, 2, 8, 0, 0]}) 
df2 = pd.DataFrame({"A": [1, 3, 2, 4, 8], "B": [5, 5, 4, 9, 1], "C": [1, 3, 3, 4, 6]}) 


df1: 
    A B C 
0 1 2 1 
1 2 5 2 
2 3 4 8 
3 4 7 0 
4 3 5 0 
... 

df2: 
    A B C 
0 1 5 1 
1 3 4 3 
2 2 5 4 
3 4 9 4 
5 8 1 6 
... 

in: df1['A'] == df2['A'] & where df1['B'] == df2['B'] 
     df1['D'] = df1['C'] + df2['C'] 

out: df1: 
    A B C D 
0 1 2 1 nan 
1 2 5 2 6 
2 3 4 8 11 
3 4 7 0 nan 
4 3 5 0 nan 

値私の実際のデータフレームは、はるかに大きい(「A」列の両方の値を持つデータの120000ish行は1から700の範囲であり、1から300まで「B」)ので、私はそれがより長いかもしれない知っていますプロセス。

+0

Iはまた、両方の列の数字 'A「の繰り返し数回、複数の列および行番号があるgrided平面から2つのデータセットと同じように考えることを言及することを意味します各セルに専用で、2つのセルが等しい(2つの行が等しく、2つの列が等しい)数学を行う必要があります。この場合、私はそれらをAとBの名前にしますが、混乱を避けるためです私はそれほどうまくやっていないと確信しています。 – rosskush

答えて

0

最初にゼロではNaNを満たす、null値が存在しないC_-{like}列、上行ごとの和をとり、次に、2つのデータフレーム

In [145]: dff = pd.merge(df1, df2, on=['A', 'B'], how='left') 

In [146]: dff 
Out[146]: 
    A B C_x C_y 
0 1 2 1 NaN 
1 2 5 2 4 
2 3 4 8 3 
3 4 7 0 NaN 

をマージすることができました。

In [147]: dff['C'] = dff.filter(regex='C_').sum(skipna=False, axis=1).fillna(0) 

In [148]: dff 
Out[148]: 
    A B C_x C_y C 
0 1 2 1 NaN 0 
1 2 5 2 4 6 
2 3 4 8 3 11 
3 4 7 0 NaN 0 

また、必要な列を削除/選択することもできます。

+0

は助けを感謝します、私はあなたが何を言っているのか見ていますが、忘れていたのは、dfの列 'A'と列 'B'の両方に、 'B'の場合は1〜300です。 – rosskush

0

あなたはdf1df2の左マージを行う、df1からすべての値を維持したいので、あなたは、列AとBの2つのデータフレームをmergeすることができます。 df2のマージされた列Cは、AとBが一致しない場合は常にnullになります。マージ後、マージされた列の名前を変更して合計を実行するだけです。

# Do a left merge, keeping df1 column names unchanged. 
df1 = pd.merge(df1, df2, how='left', on=['A', 'B'], suffixes=('', '_2')) 

# Add the two columns, fill locations that don't match with zero, and rename. 
df1['C_2'] = df1['C_2'].add(df1['C']).fillna(0) 
df1.rename(columns={'C_2': 'D'}, inplace=True)