#python #python-3.x #pandas #dataframe
Вопрос:
У меня есть список пар :
year_month = [(2020,8), (2021,1), (2021,6)]
и фрейм данных df
| ID | Year | Month |
| 1 | 2020 | 1 |
| ... |
| 1 | 2020 | 12 |
| 1 | 2021 | 1 |
| ... |
| 1 | 2021 | 12 |
| 2 | 2020 | 1 |
| ... |
| 2 | 2020 | 12 |
| 2 | 2021 | 1 |
| ... |
| 2 | 2021 | 12 |
| 3 | 2021 | 1 |
| ... |
Я хочу выбрать строки, в которых Год и месяц соответствуют одной из пар в year_month
списке :
Выход df
:
| ID | Year | Month |
| 1 | 2020 | 8 |
| 1 | 2021 | 1 |
| 1 | 2021 | 6 |
| 2 | 2020 | 8 |
| 2 | 2021 | 1 |
| 2 | 2021 | 6 |
| 3 | 2020 | 8 |
| ... |
Есть идеи, как это автоматизировать, чтобы мне оставалось только менять year_month
пары ?
Я хочу разместить много пар year_month
, поэтому я хочу вести список пар, а не перечислять все возможности в df :
Я не хочу этого делать :
df = df[((df['Year'] == 2020) amp; (df['Month'] == 8)) |
((df['Year'] == 2021) amp; (df['Month'] == 1)) | ((df['Year'] == 2021) amp; (df['Month'] == 6))]
Комментарии:
1. Извините, вы хотите, чтобы годы и месяцы оценивались индивидуально или в виде пар год-месяц, как показано ниже? Например, сохранить все строки с 2020 годом в году или те, в которых также указано 8 в месяце?
2. Я хочу, чтобы все строки имели 2020 год И 8 месяцев. Я не буду брать 2021-8. Я не возьму 2020-2.
Ответ №1:
Вы можете использовать понимание списка и отфильтровать свой фрейм данных с помощью списка кортежей, как показано ниже:
year_month = [(2020,8), (2021,1), (2021,6)]
df[[i in year_month for i in zip(df.Year,df.Month)]]
Что возвращает только парные значения:
ID Year Month
2 1 2021 1
6 2 2021 1
8 3 2021 1
Комментарии:
1. Отличный совет, спасибо за указатель. Обновлен ответ соответственно.
Ответ №2:
Один из способов использования pandas.DataFrame.merge
:
df.merge(pd.DataFrame(year_month, columns=["Year", "Month"]))
Выход:
ID Year Month
0 1 2021 1
1 2 2021 1
2 3 2021 1
Комментарии:
1. Также отлично работает, как я и хотел, спасибо !