Я получил следующий фрейм данных, df, с report_date в качестве индекса:
| Дата отчета | продажи |
|---|---|
| 2021-06-30 | 130000 |
| 2021-06-30 | 140000 |
| 2021-07-31 | 125000 |
| 2021-07-31 | 110000 |
| 2021-08-31 | 110000 |
| 2021-08-31 | 110000 |
И я хочу извлечь только 2021-06 и 2021-08. Как я мог достичь этой цели?
Я могу просто извлечь два отдельных кадра данных с помощью df['2021-06'] и df['2021-08']
Вы можете проверить df.loc['2021-06'] или df.loc['2021-08']?






Просто делать
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], :]
Выход -
| Дата отчета | продажи | |
|---|---|---|
| 0 | 2021-06 | 130000 |
| 1 | 2021-06 | 140000 |
| 2 | 2021-07 | 125000 |
| 3 | 2021-07 | 110000 |
df.index == '2021-06', df.index == '2021-07' будет False, поэтому ничего не может быть показано
Есть ли способ не сбрасывать индекс
@Hang Да, второй метод делает это. Я пробовал.
Он возвращает мне пустой фрейм данных...
@Попробуй, df.loc[["2021-06", "2021-07"], :]
KeyError: «Ни один из [Index(['2021-06', '2021-07'], dtype='object', name='report_date')] не находится в [index]"
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, вы можете просто преобразовать фрейм данных в словарь и добавить его в вопрос? И попробуйте df.loc[["2021-06-30", "2021-07-31"], :] для новых индексов.
Боюсь, что это невозможно, извините за это. Вы можете создать фрейм данных, подобный моему, для тестирования.
@Hang Я использую фрейм данных из вопроса, и все три метода работают.
Ха, это странно. Впрочем, @jezrael уже решил, можете посмотреть.
@Повесь без проблем!
Для значений соответствия можно преобразовать 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
но я хотел бы объединить в один фрейм данных, а не в два отдельных кадра данных
KeyError: «Ни один из [Index(['2021-06', '2021-08'], dtype='object', name='report_date')] не находится в [index]"
@Hang - что такое print (df.index) ?
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 - ответ был отредактирован.
это отвечает на ваш вопрос?