Pandas: удаление строк для идентификаторов, которые не существуют для каждого года

#python #pandas

#python #pandas

Вопрос:

Мой набор данных содержит информацию о банках с 2009 по 2019 год, но некоторые банки были объединены / приобретены или закрыты по пути, поэтому я хотел бы удалить все банки, которые не существовали с 2009 по 2019 год. Например, идентификаторы 32 и 56 не существуют в 2019 году, поэтому их следует удалить. Вот как выглядят мои данные:

 ID  Assets  Year
32    10    2009
45    5     2009
56    24    2009
78    9     2009
32    11    2010
45    6     2010
56    31    2010
78    14    2010
...   ...   ...
32    11    2018
45    13    2018
78    14    2018
45    13    2019
78    3     2019
  

Поскольку с 2009 по 2019 год существуют только идентификаторы 45 и 78, все остальное должно быть удалено. Вот как это должно выглядеть:

 ID  Assets  Year
45    5     2009
78    9     2009
45    6     2010
78    14    2010
...   ...   ...
45    13    2018
78    14    2018
45    13    2019
78    3     2019
  

Комментарии:

1. у вас есть список банков, которые вам нужно удалить, или вам нужно это выяснить?

2. К сожалению, у меня нет списка банков…

3. тогда как вы хотите их отфильтровать? только банки, которые существуют в 2019 году? каково условие для того, чтобы знать, что банк все еще существует?

4. Если это возможно, мне бы хотелось, чтобы банки существовали с 2009 по 2019 год, поэтому, если банк был создан в 2012 году, даже если он все еще существует в 2019 году, его следует удалить.

5. итак, банк, который имеет идентификатор в каждом отдельном году?

Ответ №1:

предполагая, что у вас есть список закрытых банковских идентификаторов:

 closed = [56, 32]

df[~df['ID'].isin(closed)]

  

в обратном порядке, предполагая, что у вас есть список существующих банков:

 opened = [45, 78]

df[df['ID'].isin(opened)]
  

ОТРЕДАКТИРОВАНО НА ОСНОВЕ РАЗЪЯСНЕНИЯ ВОПРОСА

данные:

 df = pd.DataFrame({'Assets': {0: 10, 1: 5, 2: 24, 3: 9, 4: 11, 5: 6, 6: 31, 7: 14, 8: 11, 9: 13, 10: 14, 11: 13, 12: 3},
 'ID': {0: 32, 1: 45, 2: 56, 3: 78, 4: 32, 5: 45, 6: 56, 7: 78, 8: 32, 9: 45, 10: 78, 11: 45, 12: 78},
 'Year': {0: 2009, 1: 2009, 2: 2009, 3: 2009, 4: 2010, 5: 2010, 6: 2010, 7: 2010, 8: 2018, 9: 2018, 10: 2018, 11: 2019, 12: 2019}})
  

если вам нужно получить список идентификаторов, которые были доступны в каждом году:

 ## number of unique years each id needs to have:
year_count = len(df['Year'].unique())

## get number of unique years that each id has:
id_year_count = df[['Year','ID']].groupby(['ID', 'Year']).count().reset_index().groupby('ID').count().reset_index()

## filter to get the list of ids that match the condition:
opened_every_year = id_year_count['ID'][id_year_count['Year']==year_count].tolist()

## pass the list to the df to filter as described before
df = df[df['ID'].isin(opened_every_year)]

  

Чтобы проверить:

df.sort_values(['ID', 'Year'])

выводит:

     Assets  ID  Year
1        5  45  2009
5        6  45  2010
9       13  45  2018
11      13  45  2019
3        9  78  2009
7       14  78  2010
10      14  78  2018
12       3  78  2019
  

(Обратите внимание, что в выборке данных были данные только за 4 года, поэтому были выбраны идентификаторы за все 4 года)

Комментарии:

1. Большое вам спасибо за вашу помощь. Я получил результат, который искал!

2. Рад помочь. Пожалуйста, проголосуйте и примите ответ 🙂