DataFrame самый быстрый способ обновления строк без цикла - PullRequest
0 голосов
/ 23 октября 2019

Создание сценария:

Предполагается, что фрейм данных состоит из двух серий, где A - это ввод, а B - это результат A[index]*2:

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

Позволяет сказатьЯ получаю фрейм данных размером 100 тыс. Строк и ищу в нем ошибки (здесь B->0 недопустим):

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

Поиск недопустимых строк с использованием

invalid_rows = df.loc[df['A']*2 != df['B']]

У меня есть invalid_rows сейчас, но я не уверен, что будет самым быстрым способом перезаписать недопустимые строки в исходном df с результатом A[index]*2?

Итерация по df с использованием iterrows() - вариант, но медленный, если 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 

Но есть ли более быстрый способ сделать это?

1 Ответ

2 голосов
/ 23 октября 2019

Использование mul, ne и 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 возвратлогический ряд, который отмечает строку, где A * 2 != B

print(m)

0    False
1     True
2    False
dtype: bool
...