Нарезка кадра данных с двумя индексами

Я получил следующий фрейм данных, df, с report_date в качестве индекса:

Дата отчетапродажи
2021-06-30130000
2021-06-30140000
2021-07-31125000
2021-07-31110000
2021-08-31110000
2021-08-31110000

И я хочу извлечь только 2021-06 и 2021-08. Как я мог достичь этой цели?

Я могу просто извлечь два отдельных кадра данных с помощью df['2021-06'] и df['2021-08']

это отвечает на ваш вопрос?

Aravind G. 16.05.2022 07:01

Вы можете проверить df.loc['2021-06'] или df.loc['2021-08']?

jezrael 16.05.2022 07:07
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Просто делать

df = df.reset_index()
new_df = df[(df["report_date"] == "2021-06") | (df["report_date"] == "2021-07")]

или с помощью numpy

new_df = df.iloc[np.where((df.index == "2021-06") | (df.index == "2021-07"))[0], :]

Выход -

Дата отчетапродажи
02021-06130000
12021-06140000
22021-07125000
32021-07110000

df.index == '2021-06', df.index == '2021-07' будет False, поэтому ничего не может быть показано

Hang 16.05.2022 07:05

Есть ли способ не сбрасывать индекс

Hang 16.05.2022 07:05

@Hang Да, второй метод делает это. Я пробовал.

Zero 16.05.2022 07:07

Он возвращает мне пустой фрейм данных...

Hang 16.05.2022 07:11

@Попробуй, df.loc[["2021-06", "2021-07"], :]

Zero 16.05.2022 07:15

KeyError: «Ни один из [Index(['2021-06', '2021-07'], dtype='object', name='report_date')] не находится в [index]"

Hang 16.05.2022 07:15

print (df.index) = DatetimeIndex(['2021-01-31', '2021-01-31', '2021-01-31', '2021-01-31', '2021-01-31', '31-01-2021', '31-01-2021', '31-01-2021', '31-01-2021', '31-01-2021', ... '31-12-2021' , '31.12.2021', '31.12.2021', '31.12.2021', '31.12.2021', '31.12.2021', '31.12.2021', ' 2021-12-31', '2021-12-31', '2021-12-31'], dtype='datetime64[ns]', name='report_date', length=5146, freq=None)

Hang 16.05.2022 07:15

@Hang, вы можете просто преобразовать фрейм данных в словарь и добавить его в вопрос? И попробуйте df.loc[["2021-06-30", "2021-07-31"], :] для новых индексов.

Zero 16.05.2022 07:16

Боюсь, что это невозможно, извините за это. Вы можете создать фрейм данных, подобный моему, для тестирования.

Hang 16.05.2022 07:18

@Hang Я использую фрейм данных из вопроса, и все три метода работают.

Zero 16.05.2022 07:18

Ха, это странно. Впрочем, @jezrael уже решил, можете посмотреть.

Hang 16.05.2022 07:20

@Повесь без проблем!

Zero 16.05.2022 07:20
Ответ принят как подходящий

Для значений соответствия можно преобразовать DatetimeIndex в периоды месяцев и проверить членство по Index.isin:

#if necessary
#df.index = pd.to_datetime(df.index)

df3 = df[df.index.to_period('m').isin(pd.to_datetime(['2021-06','2021-08']).to_period('m'))]
print (df3)
              sales
report_date        
2021-06-30   130000
2021-06-30   140000
2021-08-31   110000
2021-08-31   110000

Или:

df3 = df[df.index.to_period('m').isin(pd.PeriodIndex(['2021-06','2021-08'], freq='m'))]
print (df3)
              sales
report_date        
2021-06-30   130000
2021-06-30   140000
2021-08-31   110000
2021-08-31   110000

Или преобразовать значения в строки YYYY-MM и проверить по строкам в списке:

df3 = df[df.index.strftime('%Y-%m').isin(['2021-06','2021-08'])]
print (df3)
              sales
report_date        
2021-06-30   130000
2021-06-30   140000
2021-08-31   110000
2021-08-31   110000

но я хотел бы объединить в один фрейм данных, а не в два отдельных кадра данных

Hang 16.05.2022 07:09

KeyError: «Ни один из [Index(['2021-06', '2021-08'], dtype='object', name='report_date')] не находится в [index]"

Hang 16.05.2022 07:10

@Hang - что такое print (df.index) ?

jezrael 16.05.2022 07:11

DatetimeIndex(['2021-01-31', '2021-01-31', '2021-01-31', '2021-01-31', '2021-01-31', '2021-01-31' , '31-01-2021', '31-01-2021', '31-01-2021', '31-01-2021', ... '31-12-2021', '31-12-2021 ', '31-12-2021', '31-12-2021', '31-12-2021', '31-12-2021', '31-12-2021', '31-12-2021', '2021-12-31', '2021-12-31'], dtype='datetime64[ns]', name='report_date', length=5146, freq=None)

Hang 16.05.2022 07:12

@Hang - ответ был отредактирован.

jezrael 16.05.2022 07:15

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