pandas
Булевое индексирование данных
Поиск…
Вступление
Доступ к строкам в фрейме данных с использованием объектов индексатора .ix
, .loc
, .iloc
и того, как он отличается от использования булевой маски.
Доступ к DataFrame с булевым индексом
Это будет наш примерный кадр данных:
df = pd.DataFrame({"color": ['red', 'blue', 'red', 'blue']},
index=[True, False, True, False])
color
True red
False blue
True red
False blue
Доступ с помощью .loc
df.loc[True]
color
True red
True red
Доступ с помощью .iloc
df.iloc[True]
>> TypeError
df.iloc[1]
color blue
dtype: object
Важно отметить, что старые версии pandas не различали логический и целочисленный вход, поэтому
.iloc[True]
вернет то же, что и.iloc[1]
Доступ с помощью .ix
df.ix[True]
color
True red
True red
df.ix[1]
color blue
dtype: object
Как вы можете видеть, .ix
имеет два поведения. Это очень плохая практика в коде, и поэтому ее следует избегать. Пожалуйста, используйте .iloc
или .loc
чтобы быть более явным.
Применение булевой маски к кадру данных
Это будет наш примерный кадр данных:
color name size
0 red rose big
1 blue violet big
2 red tulip small
3 blue harebell small
Использование магии __getitem__
или []
accessor. Предоставляя ему список True и False той же длины, что и dataframe, вы получите:
df[[True, False, True, False]]
color name size
0 red rose big
2 red tulip small
Маскирование данных на основе значения столбца
Это будет наш примерный кадр данных:
color name size
0 red rose big
1 blue violet small
2 red tulip small
3 blue harebell small
pd.Series
к одному столбцу из фрейма данных, мы можем использовать простое сравнение ==
для сравнения каждого элемента в столбце с заданной переменной, создавая pd.Series
из True и False
df['size'] == 'small'
0 False
1 True
2 True
3 True
Name: size, dtype: bool
Этот pd.Series
является расширением np.array
который является расширением простого list
Таким образом, мы можем передать это __getitem__
или []
как в приведенном выше примере.
size_small_mask = df['size'] == 'small'
df[size_small_mask]
color name size
1 blue violet small
2 red tulip small
3 blue harebell small
Маскирование данных на основе значения индекса
Это будет наш примерный кадр данных:
color size
name
rose red big
violet blue small
tulip red small
harebell blue small
Мы можем создать маску на основе значений индекса, так же как и на значении столбца.
rose_mask = df.index == 'rose'
df[rose_mask]
color size
name
rose red big
Но делать это почти так же, как
df.loc['rose']
color red
size big
Name: rose, dtype: object
Важным отличием является то, что когда .loc
встречает только одну строку в соответствующем индексе, он возвращает pd.Series
, если он встречает больше строк, которые соответствуют, он вернет pd.DataFrame
. Это делает этот метод довольно неустойчивым.
Это поведение можно контролировать, предоставляя .loc
список одной записи. Это заставит его вернуть кадр данных.
df.loc[['rose']]
color size
name
rose red big