Не смешивайте индексирование __getitem__
и (i) loc.Используйте один или другой.Я предпочитаю (i) loc, когда вы осуществляете доступ по индексу, и __getitem__
, когда вы осуществляете доступ по столбцу или используете логическое индексирование.
Вот некоторые обычно плохие методы индексации и соответствующие исправления.
df.iloc[idx].loc[:, column]
df.iloc[idx][column]
df[column][idx]
df[column].iloc[idx]
Большинство из этих решений будут вызывать проблемы в процессе (в основном в форме SettingWithCopyWarning), когда вы пытаетесь назначить их, потому что они создают представления и привязаны к исходному фрейму данных, который они просматривают.
Правильным решением для всех этих версий является df.iloc[idx, df.columns.get_loc(column)]
Обратите внимание, что idx
- это массив целочисленных индексов, а column
- строковая метка.Аналогично для loc
.
Если у вас есть массив логических значений, используйте взамен loc
, например: df.loc[boolean_idx, column]
Кроме того, все в порядке: df[column]
и df[boolean_mask]
Существуют правила для индексации одной строки или одного столбца.В зависимости от того, как это будет сделано, вы получите либо Series, либо DataFrame.Итак, если вы хотите проиндексировать сотую строку из DataFrame df
как срез DataFrame, вам нужно сделать:
df.iloc[[100], :] # `:` selects every column
А не
df.iloc[100, :]
И аналогично дляИндексирование на основе столбцов.
Наконец, если вы хотите проиндексировать один скаляр, используйте at
или iat
.
OTOH, для вашего требования я бы предложил третью альтернативу:
ts = df.loc[df.timestamp.between(5, 10), 'timestamp']
Или, если вы все подмножество,
df = df[df.timestamp.between(5, 10)]