は、私が働いている複雑な/非常に大きなデータフレームのティーニー/おもちゃのバージョンです加わり:/外の値を埋めるには以下
>>> 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は、以下の例のデータフレームA
とB
を生成するためのコードです。 マルチキー外部ジョインの場合のため
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は場合にこのソリューションを一般しまう
key
列をスキップするEDIT
をマージは複数の列にあります。 'merge(...、on =( 'key1'、 'key2'、...)、...)'? – kjo
私は、 'merge()'を呼び出した後、結合列がわからないことは考えていません。 – HYRY
プライベート操作を使用する場合は、次の情報を得ることができます: 'mo = pd.tools.merge._MergeOperation(A、B、how =" outer "); print(mo.left_on) ' – HYRY