【问题标题】:Pandas: update column values from second dataframePandas:从第二个数据帧更新列值
【发布时间】:2018-04-06 04:57:08
【问题描述】:

我有一个数据框 df1,其中包含日期和其他值,如下所示:

date      value1     value2     value3
20100101  1          2          3
20100102  1          2          3
20100103  1          2          3
20100104  1          3          4
20100105  1          3          4
20100106  1          3          5
20100107  1          3          6

然后我想从另一个数据框df2更新一些值:

date      value1      
20100102  2           
20100104  3        
20100105  4    
20100106  5       
20100107  6     

所以预期的结果是:

date      value1     value2     value3
20100101  1          2          3
20100102  2          2          3
20100103  1          2          3
20100104  3          3          4
20100105  4          3          4
20100106  5          3          5
20100107  6          3          6  

据我所知,我不能用左连接来做到这一点,除了遍历每个日期之外,还有什么快速简单的方法可以实现这一点?


更新:

感谢所有答案!

df2df1 的日期不同时,我还有另一个案例,例如

date      value1      
20100102  2           
20100104  3        
20100105  4    
20100106  5       
20100107  6   
20100108  7

dropna(axis=0, how='any') 添加到 piRSquared 的答案将解决这种情况。

【问题讨论】:

    标签: python pandas dataframe left-join


    【解决方案1】:

    选项 1

    d2.set_index('date').combine_first(
        d1.set_index('date')).reset_index().astype(d1.dtypes)
    
           date  value1  value2  value3
    0  20100101       1       2       3
    1  20100102       2       2       3
    2  20100103       1       2       3
    3  20100104       3       3       4
    4  20100105       4       3       4
    5  20100106       5       3       5
    6  20100107       6       3       6
    

    选项 2

    d1[['date']].merge(d2, 'left').combine_first(d1).astype(d1.dtypes)
    
           date  value1  value2  value3
    0  20100101       1       2       3
    1  20100102       2       2       3
    2  20100103       1       2       3
    3  20100104       3       3       4
    4  20100105       4       3       4
    5  20100106       5       3       5
    6  20100107       6       3       6
    

    【讨论】:

    • 谢谢!这正是我想要的。此外,我添加了 dropna(axis=0, how='any') 以删除 d2 中在 d1 中找不到日期的行。
    【解决方案2】:

    我认为这样更快:

    In [58]: df.loc[df[df.date.isin(sd.date)].index,'value1'] = sd.value1.values.tolist()
    
    In [59]: df
    Out[59]: 
           date  value1  value2  value3
    0  20100101       1       2       3
    1  20100102       2       2       3
    2  20100103       1       2       3
    3  20100104       3       3       4
    4  20100105       4       3       4
    5  20100106       5       3       5
    6  20100107       6       3       6
    In [61]: %timeit df.loc[df[df.date.isin(sd.date)].index,'value1'] = sd.value1.values.tolist()
    1000 loops, best of 3: 703 µs per loop
    
    In [62]: %timeit sd.set_index('date').combine_first(df.set_index('date')).reset_index().astype(df.dtypes)
    100 loops, best of 3: 4.08 ms per loop
    

    【讨论】:

    • 谢谢!这个解决方案非常适合这个特殊问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2018-04-28
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多