我看到在多线程环境中更新数据帧的奇怪行为。我正在逐个单元地更新,使用锁,因此只有一个进程同时访问数据帧。它是大型应用程序的一部分,但简而言之,这就是正在发生的事情,其中 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()
现在 - 无论我使用什么版本,第一个打印语句都会起作用并给出正确的值。但是除了版本 1 之外,第二个打印语句都失败(返回 pandas.np.nan)。看起来只有版本 1 真正更新了数据帧。
想法?谢谢,
最佳答案
回答我自己的问题:使用 Pandas 0.17,我不再遇到这个问题,事情按预期进行。我相信在发布最初的问题时我正在使用 Pandas 0.14。 FWIW,.at 明显比 .loc 快,因此它最终是一个重大改进。
关于python - Pandas 在数据帧中设置值,多线程 - loc 与 set_value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30639062/