Почему я могу использовать квадратные скобки для ссылки на метки столбцов и индексы строк при использовании pandas кадра данных? - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть фрейм данных (df) с датами в качестве меток индекса и столбца. Я могу получить часть кадра данных, используя df['2008':] для ссылки на индекс, но я всегда предполагал, что сначала нужно было указать столбцы, например, df[:]['2008':], и я просто хочу понять, почему это так ? Может ли это вызвать проблемы при обращении к индексам или столбцам с одинаковыми именами?

Ответы [ 2 ]

0 голосов
/ 11 апреля 2020
  1. Форма

    df[something]
    

    определяет

    1. серию (из столбца ), если что-то - это имя столбца,
    2. кадр данных (из выбранных столбцов ), если что-то - это список имен столбцов, или
    3. фрейм данных из выбранных строк , если что-то представляет собой список или серию True / False значений.

    Примеры:

    1. df["column1"]
    2. df[["column1", "column5"]]
    3. df[[True, False, True]] # assuming your dataframe has exactly 3 rows
  2. Форма

    df[row(s), column(s)]
    

    (поэтому row(s) являются первыми, column(s) являются вторыми)
    выберите ячейку (и) на пересечении ряд (ы) и столбец (и) .

    Для обеспечения безопасности вместо эта форма использует явную форму

    df.loc[row(s), column(s)]
    

    , чтобы определить row(s) и col(s) по их меткам (в противоположность их нулям порядковых номеров ) .

0 голосов
/ 11 апреля 2020

Интересный вопрос, давайте создадим простой DataFrame, чтобы провести несколько экспериментов:

import pandas as pd

df = pd.DataFrame({'2008': [1, 3], 'column 2': [2, 4]}, 
                  index = ['2007', '2008'])
df
        2008    column 2
2007    1       2
2008    3       4

Как вы говорите, обычный способ выбора столбца - индексировать его имя в квадратных скобках:

df['2008']
2007    1
2008    3
Name: 2008, dtype: int64

Так что это работает, даже если есть индексное значение с тем же именем. А как насчет выбора некоторых строк?

df['2008':]
        2008    column 2
2008    3       4

Это также все еще работает! Можем ли мы разрезать столбцы таким же образом?

df['column 2':]
    2008    column 2

Нет, pandas все еще предполагает, что мы хотим нарезать определенные строки, например, мы получаем пустой DataFrame, так как индекс 'column 2' не делает существовать.

Вывод: Если вы укажете один индекс в квадратных скобках, pandas предполагает, что это имя столбца. Но если вы предоставляете одну операцию среза в квадратных скобках, pandas предполагает, что вы хотите нарезать индекс (то есть выбрать определенные строки). Это имеет смысл, поскольку нарезка более естественна для индекса, чем для имен столбцов.

Тем не менее, это может сбивать с толку и не очень удобочитаемо, поэтому я бы рекомендовал использовать loc, чтобы явно дать обоим строка и столбец нарезки для таких операций:

df.loc['2008':, :]
        2008    column 2
2008    3       4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...