DataFrame 在没有循环的情况下更新行的最快方法

DataFrame fastest way to update rows without a loop

创建场景:

假设一个包含两个系列的数据帧,其中 A 是输入,BA[index]*2 的结果:

df = pd.DataFrame({'A': [1, 2, 3],
                   'B': [2, 4, 6]})

假设我正在接收一个 100k 行的数据帧并在其中搜索错误(此处 B->0 无效):

df = pd.DataFrame({'A': [1, 2, 3],
                   'B': [2, 0, 6]})

使用

搜索无效行
invalid_rows = df.loc[df['A']*2 != df['B']]

我现在有 invalid_rows,但我不确定用 A[index]*2 的结果覆盖原始 df 中的无效行的最快方法是什么?

使用 iterrows() 迭代 df 是一种选择,但如果 df 增长则速度较慢。我能以某种方式使用 df.update() 吗?

带循环的工作解决方案:

index = -1
for row_index, my_series in df.iterrows():
  if myseries['A']*2 != myseries['B']:
    df[index]['B'] = myseries['A']*2 

但是有更快的方法吗?

使用mul, ne and loc

m = df['A'].mul(2).ne(df['B'])
# same as: m = df['A'] * 2 != df['B']
df.loc[m, 'B'] = df['A'].mul(2)

   A  B
0  1  2
1  2  4
2  3  6

m returns 一个布尔系列,标记 A * 2 != B

所在的行
print(m)

0    False
1     True
2    False
dtype: bool