Поиск…


Вступление

Доступ к строкам в фрейме данных с использованием объектов индексатора .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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow