Skip to main content
 首页 » 编程设计

python之Pandas 在数据帧中设置值,多线程之loc 与 set_value

2024年10月25日29xiaohuochai

我看到在多线程环境中更新数据框时出现奇怪的行为。我正在逐个单元地更新,使用锁,因此只有一个进程同时访问数据帧。它是大型应用程序的一部分,但简而言之,这就是正在发生的事情,其中​​ df 是大型类(自身)中的数据框:

def update_data(self, idx): 
    self.update_cell(idx, 'a', 0.5*(self.df.at[idx,'b']+self.df.at[idx,'c'])) 
    print self.df.at[idx,'a'] 
    print self.df.loc[idx,'a'] 
 
def update_cell(self,idx,col,value): 
    self.lock.acquire() 
    # version 1: self.df.loc[idx,col] = value 
    # version 2: self.df.at[idx,col] = value 
    # version 3: self.df.set_value(idx,col,value) 
    self.lock.release() 

现在 - 无论我使用什么版本,第一个 print 语句都有效并给出正确的值。但是第二个打印语句在除版本 1 之外的所有版本中都失败了(返回 pandas.np.nan)。看起来只有版本 1 真正更新了数据框。

想法?谢谢,

请您参考如下方法:

回答我自己的问题:使用 Pandas 0.17,我不再遇到这个问题,一切都按预期进行。我相信我在发布初始问题时使用的是 Pandas 0.14。 FWIW,.at 明显快于 .loc,因此它最终是一个显着的改进。