Другой способ мог бы использовать .loc
метод pandas.DataFrame
который возвращает индексированный расположение строк, которые квалифицируют булево индексацию:
df.loc[(df['256'] != df['Z'])].index
с выходом:
Int64Index([1, 3], dtype='int64')
Это самая быстрая из перечисленных реализаций, как видно из ipython notebook
:
import pandas as pd
import numpy as np
df = pd.DataFrame({"256":np.random.randint(0,10,1594), "Z": np.random.randint(0,10,1594)})
%timeit df.loc[(df['256'] != df['Z'])].index
%timeit row_ids = df[df["256"] != df.Z].index
%timeit rows = list(df[df['256'] != df.Z].index)
%timeit df[df['256'] != df['Z']].index
с выходом:
1000 loops, best of 3: 352 µs per loop
1000 loops, best of 3: 358 µs per loop
1000 loops, best of 3: 611 µs per loop
1000 loops, best of 3: 355 µs per loop
Однако, когда дело доходит до 5-10 микросекунд он не делает существенную разницу, но если в будущем у вас есть очень большой набор данных, время и эффективность могут стать гораздо более важной проблемой. Для вашего относительно небольшого набора данных из 1594 строк я бы пошел с решением, которое выглядит наиболее элегантным и способствует наиболее читабельности.
Ваш 'row_ids + 1' из-за« нулевой индексации »на самом деле является вашей попыткой исправить неразрешенную логическую ошибку. У вас есть 'df [df [" 256 "] == df.Z] .index', который находит индексы, где значения столбца равны, и OP хочет их там, где они не равны, поэтому' df [df ["256"] ! = df.Z] .index'. Тогда вам не нужно 'row_ids + 1', если OP не хочет видеть индекс' 0th'. –
@aus_lacy о, я полностью пропустил это - спасибо – cel
Не стоит беспокоиться. Не забудьте изменить свой вывод как подходящий '[1, 3]' как и ожидалось. –