概要
pandas で DataFrame (indexあり) の列を別の DataFrame (同じ構造のindexあり) に加える方法を試す。
※結論: index があえばレコードが一致してなくてもいい。left join 的に足せる。
単純に列を足す
※index があればレコード数が異なっていても問題ない。
import pandas as pd
A = pd.DataFrame(data={'a':[1, 2, 3], 'b': ['b1','b2','b3'], 'c': ['c1','c2','c3']}).set_index('a')
B = pd.DataFrame(data={'a':[ 2, 3], 'd': [ 'd2','d3'], 'e': [ 'e2','e3']}).set_index('a')
# d を足す (Series として足す)
A['d'] = B['d']
# もしくは
# DataFrame として足してもいい
A['d'] = B[['d']]
# b c d
# a
# 1 b1 c1 NaN
# 2 b2 c2 d2
# 3 b3 c3 d3
# NaN の代わりに 0 を入れたいなら、上記のあとで
A['d'] = A['d'].fillna(0)
# b c d
# a
# 1 b1 c1 0
# 2 b2 c2 d2
# 3 b3 c3 d3
# 条件の結果を代入することも可能
A['f'] = (B.d == "d2")
# b c f
# a
# 1 b1 c1 NaN
# 2 b2 c2 True
# 3 b3 c3 False
複数列を同時に加えるなら
import pandas as pd
A = pd.DataFrame(data={'a':[1, 2, 3], 'b': ['b1','b2','b3'], 'c': ['c1','c2','c3']}).set_index('a')
B = pd.DataFrame(data={'a':[ 2, 3], 'd': [ 'd2','d3'], 'e': [ 'e2','e3']}).set_index('a')
A = A.merge(B, how='left', left_index=True, right_index=True)
# もしくは
A['d'] = B.d
A['e'] = B.e
indexが重複していてもleft joinされる
import pandas as pd
A = pd.DataFrame(data={'a':[1, 2, 3], 'b': ['b1','b2','b3'], 'c': ['c1','c2','c3']}).set_index('a')
C = pd.DataFrame(data={'a':[2, 2, 3]}).set_index('a')
C['b'] = A.b
# b
# a
# 2 b2
# 2 b2
# 3 b3
# 当然だが right 側がキー重複してるとエラー
D = pd.DataFrame(data={'a':[2, 2, 3], 'g':['g1','g2','g3']}).set_index('a')
A['g'] = D.g
# ValueError: cannot reindex from a duplicate axis