2016-09-28 4 views
2

は、私が働いている複雑な/非常に大きなデータフレームのティーニー/おもちゃのバージョンです加わり:/外の値を埋めるには以下

>>> A 
    key   u   v   w   x 
0 a 0.757954 0.258917 0.404934 0.303313 
1 b 0.583382 0.504687  NaN 0.618369 
2 c  NaN 0.982785 0.902166  NaN 
3 d 0.898838 0.472143  NaN 0.610887 
4 e 0.966606 0.865310  NaN 0.548699 
5 f  NaN 0.398824 0.668153  NaN 

>>> B 
    key   y   z 
0 a 0.867603  NaN 
1 b  NaN 0.191067 
2 c 0.238616 0.803179 
3 p 0.080446  NaN 
4 q 0.932834  NaN 
5 r 0.706561 0.814467 

(FWIW、この記事の最後に、私はコードを提供しますこれらのデータフレームを生成する。)

私は、外で誘発される新しい位置はデフォルト値0.0を得るに参加するような方法で、keyコラムにこれらのデータフレームの外部結合を生成します。 IOWは、所望の結果は、この

key   u   v   w   x   y   z 
0 a 0.757954 0.258917 0.404934 0.303313 0.867603  NaN 
1 b 0.583382 0.504687  NaN 0.618369  NaN 0.191067 
2 c  NaN 0.982785 0.902166  NaN 0.238616 0.803179 
3 d 0.898838 0.472143  NaN 0.610887 0.000000 0.000000 
4 e 0.966606 0.86531  NaN 0.548699 0.000000 0.000000 
5 f  NaN 0.398824 0.668153  NaN 0.000000 0.000000 
6 p 0.000000 0.000000 0.000000 0.000000 0.080446  NaN 
7 q 0.000000 0.000000 0.000000 0.000000 0.932834  NaN 
8 r 0.000000 0.000000 0.000000 0.000000 0.706561 0.814467 

(この所望の出力、すなわち、AまたはBに既に存在していたものを、いくつかのNaNを含むことに注意してください。)のように見えます

merge方法は私が途中を取得しますしかし、塗りつぶされたデフォルト値はNaNでの、0.0ないのである。

>>> C = pandas.DataFrame.merge(A, B, how='outer', on='key') 
>>> C 
    key   u   v   w   x   y   z 
0 a 0.757954 0.258917 0.404934 0.303313 0.867603  NaN 
1 b 0.583382 0.504687  NaN 0.618369  NaN 0.191067 
2 c  NaN 0.982785 0.902166  NaN 0.238616 0.803179 
3 d 0.898838 0.472143  NaN 0.610887  NaN  NaN 
4 e 0.966606 0.865310  NaN 0.548699  NaN  NaN 
5 f  NaN 0.398824 0.668153  NaN  NaN  NaN 
6 p  NaN  NaN  NaN  NaN 0.080446  NaN 
7 q  NaN  NaN  NaN  NaN 0.932834  NaN 
8 r  NaN  NaN  NaN  NaN 0.706561 0.814467 

がLEFなければならないいくつかの位置を変更するためfillna方法は、所望の出力を生成することができませんt変更なし:

>>> C.fillna(0.0) 
    key   u   v   w   x   y   z 
0 a 0.757954 0.258917 0.404934 0.303313 0.867603 0.000000 
1 b 0.583382 0.504687 0.000000 0.618369 0.000000 0.191067 
2 c 0.000000 0.982785 0.902166 0.000000 0.238616 0.803179 
3 d 0.898838 0.472143 0.000000 0.610887 0.000000 0.000000 
4 e 0.966606 0.865310 0.000000 0.548699 0.000000 0.000000 
5 f 0.000000 0.398824 0.668153 0.000000 0.000000 0.000000 
6 p 0.000000 0.000000 0.000000 0.000000 0.080446 0.000000 
7 q 0.000000 0.000000 0.000000 0.000000 0.932834 0.000000 
8 r 0.000000 0.000000 0.000000 0.000000 0.706561 0.814467 

希望する出力を効率的に達成するにはどうすればよいですか? (ここでは、パフォーマンスの問題は、私はここに示されたものよりもはるかに大きいデータフレームに対してこの操作を実行しようとするので。)


FWIWは、以下の例のデータフレームABを生成するためのコードです。 マルチキー外部ジョインの場合のため

from pandas import DataFrame 
from collections import OrderedDict 
from random import random, seed 

def make_dataframe(rows, colnames): 
    return DataFrame(OrderedDict([(n, [row[i] for row in rows]) 
           for i, n in enumerate(colnames)])) 

maybe_nan = lambda: float('nan') if random() < 0.4 else random() 

seed(0) 

A = make_dataframe([['a', maybe_nan(), maybe_nan(), maybe_nan(), maybe_nan()], 
        ['b', maybe_nan(), maybe_nan(), maybe_nan(), maybe_nan()], 
        ['c', maybe_nan(), maybe_nan(), maybe_nan(), maybe_nan()], 
        ['d', maybe_nan(), maybe_nan(), maybe_nan(), maybe_nan()], 
        ['e', maybe_nan(), maybe_nan(), maybe_nan(), maybe_nan()], 
        ['f', maybe_nan(), maybe_nan(), maybe_nan(), maybe_nan()]], 
        ('key', 'u', 'v', 'w', 'x')) 

B = make_dataframe([['a', maybe_nan(), maybe_nan()], 
        ['b', maybe_nan(), maybe_nan()], 
        ['c', maybe_nan(), maybe_nan()], 
        ['p', maybe_nan(), maybe_nan()], 
        ['q', maybe_nan(), maybe_nan()], 
        ['r', maybe_nan(), maybe_nan()]], 
        ('key', 'y', 'z')) 

hereを参照。

答えて

1

あなたはmerge後にゼロを埋めることができます。

res.loc[~res.key.isin(A.key), A.columns.drop("key")] = 0 
+0

質問:どのように1は場合にこのソリューションを一般しまうkey列をスキップする

res = pd.merge(A, B, how="outer") res.loc[~res.key.isin(A.key), A.columns] = 0 

EDIT

をマージは複数の列にあります。 'merge(...、on =( 'key1'、 'key2'、...)、...)'? – kjo

+0

私は、 'merge()'を呼び出した後、結合列がわからないことは考えていません。 – HYRY

+0

プライベート操作を使用する場合は、次の情報を得ることができます: 'mo = pd.tools.merge._MergeOperation(A、B、how =" outer "); print(mo.left_on) ' – HYRY

関連する問題