我看到在多线程环境中更新数据框时出现奇怪的行为。我正在逐个单元地更新,使用锁,因此只有一个进程同时访问数据帧。它是大型应用程序的一部分,但简而言之,这就是正在发生的事情,其中 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,因此它最终是一个显着的改进。
