Я пытаюсь изучить и ПОНИМАТЬ логику 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']])
Я был бы рад понять, почему эти две показанные строки кода не работают.
Спасибо.






Вам нужно преобразовать значения списка в 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
@Berlines - Да, это важно, потому что используется partial-string-indexing - поэтому нет необходимости преобразовывать оба значения в даты, такие как print(df.loc[pd.to_datetime('20130102'):pd.to_datetime('20130104'),'A':'C'])
@Berlines - Вы очень близки, если хотите выбрать по первому и последнему значению с :, между необходимостью удалить список, поэтому работает print(df.loc[['row1','row3'], 'A':'C'])
Если вы хотите выбирать по спискам, нужен print(df.loc[['row1','row3'], ['A', 'C']]) - выбирайте только столбцы A, C
Этот код объясняет различные способы доступа к данным (нарезки) с помощью 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
вывод: при использовании диапазона не помещайте его между [] Но используйте [], чтобы включить список значений.
Вы имеете в виду, что это как-то связано с тем, что индексы - это даты? Я собираюсь попробовать, что произойдет, если индекс будет, например, row1, row2, row3, т.е. чистый текст