#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. Рад помочь. Пожалуйста, проголосуйте и примите ответ 🙂