2017-01-12 18 views
2

私は2台のパンダデータフレームABを持っています。
データフレームには同じインデックスと列があり、異なるデータのみです。 私はインデックスのサブセットである追加の配列Xを持っています。私が達成したい何条件付きパンダデータフレームの結合

: もBと同じインデックスおよび列を持った行列C。データの場合は、インデックスがXの場合はAの行エントリが必要です。それ以外の場合は、行エントリがBになります。

私はこれを達成するためのpythonic方法があると思ったが、コンパイルしません。だから、例えば私がAの指標とCデータフレームを作成してからのようなものを試みた:

C = C.apply(lambda i: A.ix[i.index] if i in X else B.ix[i.index]) 

を私は基本的に数学的にそれを解決するため、現時点で働いて何かを持っています。だからXに基づいて2つのブール値の配列を作成して、それぞれABからそれぞれのエントリを指定します。私はそれらのマトリックスによってBを乗算した後C = + Bを行います。これは解決策を達成するために非常に長い間巻き込まれているようです。短くて読みやすいものの後ろにいた。私の現在のソリューションは、次のようになります。あなたは基本的に自分のデータフレームの1のコピーを取ると一致するインデックスに対するフィルタが他の1からレコードを更新

C = A.copy() 
C.update(B.iloc[X]) 

def testIn(row): 
    return [x in X for x in row.index] 
def testOut(row): 
    return [x not in X for x in row.index] 

AMAP = C.apply(testIn, axis=0) 
BMAP = C.apply(testOut, axis=0) 

ANEW = pandas.DataFrame(AMAP*A) 
BNEW = pandas.DataFrame(BMAP*B) 

C = ANEW + BNEW 

答えて

1

B = pd.DataFrame(np.zeros((6, 6)), list('ABCDEF'), list('abcdef')) 
A = pd.DataFrame(np.ones((6, 6)), B.index, B.columns) 
x = ['A', 'D'] 

pd.DataFrame.combine_first

から値を取り、次のデータを考えてみましょう最初のデータフレームと2番目のデータフレームを補足します。しかし locをリスト xに使って、私は Aを私が望む行だけに制限し、残りの部分を Bと組み合わせます。

C = A.loc[x].combine_first(B) 

print(C) 

    a b c d e f 
A 1.0 1.0 1.0 1.0 1.0 1.0 
B 0.0 0.0 0.0 0.0 0.0 0.0 
C 0.0 0.0 0.0 0.0 0.0 0.0 
D 1.0 1.0 1.0 1.0 1.0 1.0 
E 0.0 0.0 0.0 0.0 0.0 0.0 
F 0.0 0.0 0.0 0.0 0.0 0.0 

他の選択肢もちろんの更新

A.query('index in @x').combine_first(B) 

B.drop(x).append(A.loc[x]).reindex_like(A) 

1

はこのような何かを行います。あなたがCへの完全なコピーを惜しましたい場合

、あなたはXに対して、AとBを分割することができます

C = A[~A.index.isin(X)] 
C = C.append(B.iloc[X]).reindex(A.index) 
+0

!ありがとうございました。私はこれを他の場所で使っていましたが、ここで解決策として見落としました。 – MMM