在保留数据帧之一的索引的同时合并列上的熊猫数据帧的最快方法是什么?

考虑两个数据帧:

df1=pd.DataFrame({'ts':[1,2,3,4,5,6,7,8,9,10],'bt':[1,1,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,4],'a':[1,5],'b':[2,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

如果有人能建议实现上述组合数据框的最佳和最快方法,那就太好了。

song8531019 回答:在保留数据帧之一的索引的同时合并列上的熊猫数据帧的最快方法是什么?

试试:

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
,

在你的情况下做 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
,

左合并 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
本文链接:https://www.f2er.com/1005.html

大家都在问