#python #pandas #dataframe
Вопрос:
У меня есть фрейм данных о голосах панд, и мне нужно ограничить количество голосов по каждому электронному письму до 3 в день, удалив строки после их 3-го голосования только за тот же день. Поэтому мне просто нужно было бы удалить четвертую строку для электронной почты «а». Спасибо!
Date Email Idea
5/25 a 1
5/25 a 2
5/25 a 3
5/25 a 4
5/26 a 2
5/25 b 2
5/25 b 4
Комментарии:
1. попробуйте df.groupby([‘Дата’, ‘Электронная почта’]).глава(3)
Ответ №1:
Я попытался повторить ваш пример. Работает следующий подход.
d = {
"Date": ["5/25", "5/25", "5/25", "5/25", "5/25", "5/25", "5/25"],
"Email": ["a", "a", "a", "a", "b", "b", "b"],
"Idea": [1, 2, 3, 4, 2, 2, 4]
}
df = pd.DataFrame(data=d)
df.groupby(['Date', 'Email']).head(3)
Date Email Idea
0 5/25 a 1
1 5/25 a 2
2 5/25 a 3
4 5/25 b 2
5 5/25 b 2
6 5/25 b 4
Что выглядит как желаемое поведение.
Ответ №2:
Вы могли бы сделать это следующим образом: сделайте совокупную сумму по группам
df["Occ_Number"] = df.groupby(['Date','Email']).cumcount() 1
что дает:
Date Email Idea Occ_Number
0 25-May a 1 1
1 25-May a 2 2
2 25-May a 3 3
3 25-May a 4 4
4 26-May a 2 1
5 25-May b 2 1
6 25-May b 4 2
и создайте новый df, содержащий строки, максимальные по группам, но исключающие те, которые встречаются только один раз
df_remove = pd.DataFrame(df.groupby(['Date','Email'], sort=False)['Occ_Number'].max()).reset_index()
df_remove_2 = df_remove[df_remove['Occ_Number']>3]
Это дает:
Date Email Occ_Number
0 25-May a 4
Теперь удалите df_remove_2
из своего исходного df:
print (pd.merge(df,df_remove_2, indicator=True, how='outer')
.query('_merge=="left_only"')
.drop('_merge', axis=1))
который возвращает:
Date Email Idea Occ_Number
0 25-May a 1 1
1 25-May a 2 2
2 25-May a 3 3
4 26-May a 2 1
5 25-May b 2 1
6 25-May b 2 2