考虑两个数据帧:
df1=pd.DataFrame({'ts':[1,2,3,4,5,6,7,8,9,10],'bt':[1,1,1,2,2,2,3,3,3,4]}).set_index("ts")
print(df1)
>>>
bt
ts
1 1
2 1
3 1
4 2
5 2
6 2
7 3
8 3
9 3
10 4
df2=pd.DataFrame({'bt':[1,2,3,4],'a':[1,4,2,5],'b':[2,5,4,9]}).set_index("bt")
print(df2)
>>>
a b
bt
1 1 2
2 4 5
3 2 4
4 5 9
我想将它们合并到 bt
值上,该值是第一个 df 中的列和第二列中的索引,同时保留第一个数据框中的 ts。因此,我正在寻求的输出是:
bt a b
ts
1 1 NaN NaN
2 1 NaN NaN
3 1 1.0 2.0
4 2 NaN NaN
5 2 NaN NaN
6 2 4.0 5.0
7 3 NaN NaN
8 3 NaN NaN
9 3 2.0 4.0
10 4 5.0 9.0
如果有人能建议实现上述组合数据框的最佳和最快方法,那就太好了。
答案 0 :(得分:1)
试试:
x = df1.drop_duplicates(subset="bt", keep="last")
x = x.merge(df2, left_on="bt", right_index=True).drop(columns="bt")
print(pd.concat([df1, x], axis=1))
打印:
bt a b
ts
1 1 NaN NaN
2 1 NaN NaN
3 1 1.0 2.0
4 2 NaN NaN
5 2 NaN NaN
6 2 4.0 5.0
7 3 NaN NaN
8 3 NaN NaN
9 3 2.0 4.0
10 4 5.0 9.0
答案 1 :(得分:1)
在你的情况下做 drop_duplicates
然后 merge
out = df1.drop_duplicates('bt',keep='last').\
merge(df2,left_on='bt',right_index=True).combine_first(df1)
Out[102]:
a b bt
ts
1 NaN NaN 1.0
2 NaN NaN 1.0
3 1.0 2.0 1.0
4 NaN NaN 2.0
5 NaN NaN 2.0
6 4.0 5.0 2.0
7 NaN NaN 3.0
8 NaN NaN 3.0
9 2.0 4.0 3.0
10 5.0 9.0 4.0
答案 2 :(得分:0)
左合并 df1 和 df2,然后使用 keep=last 将 NaN
分配给 a 和 b 列的重复行。
out = df1.reset_index().merge(df2, on='bt', how='left').set_index('ts')
out.loc[out.duplicated(subset=['a', 'b'], keep='last'), ['a', 'b']] = float('nan')
输出:
bt a b
ts
1 1 NaN NaN
2 1 NaN NaN
3 1 1.0 2.0
4 2 NaN NaN
5 2 NaN NaN
6 2 4.0 5.0
7 3 NaN NaN
8 3 NaN NaN
9 3 2.0 4.0
10 4 5.0 9.0