Фрейм данных Pandas содержит строки, в которых значения 2 столбцов находятся в списке пар

#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. Также отлично работает, как я и хотел, спасибо !