Логика выбора значений Pandas LOC

Я пытаюсь изучить и ПОНИМАТЬ логику Pandas LOC, и я не могу найти объяснения следующей проблемы. Если я хочу разрезать фрейм данных с помощью LOC, я могу сделать это следующим образом

dates=pd.date_range('20130101',periods=6)
df=pd.DataFrame(np.random.rand(6,4),index=dates,columns=list('ABCD'))

print(df.loc['20130102':'20130104',['A','B']])  (*)

Все в порядке. Я не понимаю, что если во второй части LOC я могу ввести список заголовков столбцов ['A', 'B'], почему я не могу сделать то же самое для строк? то есть следующее не будет работать

print(df.loc[['20130102','20130104'],['A','B']])

В чем логика? Я даю LOC два индекса строк и два заголовка столбцов, но это не сработает. Для части столбцов список подходит, для части строк - нет. Кроме того, в первой части LOC (см. *) к индексам строк можно получить доступ с помощью ":", т.е. от index1 до index2 = 'index1': 'index2', но я не могу сделать то же самое в части 2 функции LOC : это не сработает:

print(df.loc['20130102':'20130104',['A':'C']])

Я был бы рад понять, почему эти две показанные строки кода не работают.

Спасибо.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
93
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно преобразовать значения списка в datetimes, потому что DatetimeIndex, значит нужны те же типы значений списка и значений индекса / столбцов DataFrame, иначе KeyError:

print(df.loc[pd.to_datetime(['20130102','20130104']),['A','B']])
                   A         B
2013-01-02  0.719469  0.423106
2013-01-04  0.438572  0.059678

Выбор по первому и последнему значению индекса / столбцов

Конвертировать в datetimes не нужно, потому что частичная индексация строк.

Для выбора по диапазону удалите только список [] для выбора столбцов:

print(df.loc['20130102':'20130104','A':'C'])
                   A         B         C
2013-01-02  0.719469  0.423106  0.980764
2013-01-03  0.480932  0.392118  0.343178
2013-01-04  0.438572  0.059678  0.398044

Аналогичное решение для выбора времени:

print(df.loc['2013-01-02':'2013-01-04','A':'C'])
                   A         B         C
2013-01-02  0.719469  0.423106  0.980764
2013-01-03  0.480932  0.392118  0.343178
2013-01-04  0.438572  0.059678  0.398044

Комбинации:

#select betwen start/end datetime and only columns A,C
print(df.loc['20130102':'20130104',['A','C']])
                   A         C
2013-01-02  0.719469  0.980764
2013-01-03  0.480932  0.343178
2013-01-04  0.438572  0.398044

#select only 20130102, 20130104 index and columns between A and C
print(df.loc[pd.to_datetime(['20130102','20130104']),'A':'C'])
                   A         B         C
2013-01-02  0.719469  0.423106  0.980764
2013-01-04  0.438572  0.059678  0.398044

Вы имеете в виду, что это как-то связано с тем, что индексы - это даты? Я собираюсь попробовать, что произойдет, если индекс будет, например, row1, row2, row3, т.е. чистый текст

JFerro 23.12.2018 14:20

@Berlines - Да, это важно, потому что используется partial-string-indexing - поэтому нет необходимости преобразовывать оба значения в даты, такие как print(df.loc[pd.to_datetime('20130102'):pd.to_datetime('2013‌​0104'),'A':'C'])

jezrael 23.12.2018 14:25

@Berlines - Вы очень близки, если хотите выбрать по первому и последнему значению с :, между необходимостью удалить список, поэтому работает print(df.loc[['row1','row3'], 'A':'C'])

jezrael 23.12.2018 14:36

Если вы хотите выбирать по спискам, нужен print(df.loc[['row1','row3'], ['A', 'C']]) - выбирайте только столбцы A, C

jezrael 23.12.2018 14:36

Этот код объясняет различные способы доступа к данным (нарезки) с помощью LOC в пандах:

df=pd.DataFrame(np.random.rand(6,4),index=['row1','row2','row3','row4','row5','row6'],columns=list('ABCD'))
         A         B         C         D
row1  0.972614  0.193116  0.448413  0.731300
row2  0.135391  0.783295  0.959058  0.107872
row3  0.966703  0.742793  0.852716  0.710681
row4  0.976819  0.920898  0.665329  0.078999
row5  0.418717  0.122677  0.716004  0.977522
row6  0.101422  0.641862  0.157751  0.888720

row_range column_range:

df.loc['row1':'row3', 'A':'C']

            A         B         C
row1  0.972614  0.193116  0.448413
row2  0.135391  0.783295  0.959058
row3  0.966703  0.742793  0.852716

values_rows диапазон_столбцов:

df.loc[['row1','row3'], 'A':'C']
             A         B         C
row1  0.972614  0.193116  0.448413
row3  0.966703  0.742793  0.852716

row_range column_values:

df.loc['row1':'row3', ['A','C']]
            A         C
row1  0.972614  0.448413
row2  0.135391  0.959058
row3  0.966703  0.852716

Одно значение:

df.loc['row1','A'])

0.972614309371533

вывод: при использовании диапазона не помещайте его между [] Но используйте [], чтобы включить список значений.

Другие вопросы по теме