#python #pandas #dataframe #data-manipulation #data-science
#python #pandas #фрейм данных #манипулирование данными #наука о данных
Вопрос:
Я пытаюсь сгруппировать столбец и вычислить количество значений в другом столбце.
import pandas as pd
dftest = pd.DataFrame({'A':[1,1,1,1,1,1,1,1,1,2,2,2,2,2],
'Amt':[20,20,20,30,30,30,30,40, 40,10, 10, 40,40,40]})
print(dftest)
dftest выглядит так
A Amt
0 1 20
1 1 20
2 1 20
3 1 30
4 1 30
5 1 30
6 1 30
7 1 40
8 1 40
9 2 10
10 2 10
11 2 40
12 2 40
13 2 40
выполнить группировку
grouper = dftest.groupby('A')
df_grouped = grouper['Amt'].value_counts()
что дает
A Amt
1 30 4
20 3
40 2
2 40 3
10 2
Name: Amt, dtype: int64
я хочу сохранить две верхние строки каждой группы
Кроме того, я был озадачен ошибкой, когда я попытался reset_index
df_grouped.reset_index()
что выдает следующую ошибку
ошибка df_grouped.reset_index() ValueError: не удается вставить Amt, уже существует
Комментарии:
1. если вы это сделаете
dftest.groupby('A', as_index=False)
, вам не понадобитсяreset_index()
Ответ №1:
Вам нужен параметр name
reset_index
, потому Series
что имя совпадает с именем одного из уровней MultiIndex
:
df_grouped.reset_index(name='count')
Другим решением является rename
Series
name:
print (df_grouped.rename('count').reset_index())
A Amt count
0 1 30 4
1 1 20 3
2 1 40 2
3 2 40 3
4 2 10 2
Вместо этого более распространенным решением value_counts
является aggregate size
:
df_grouped1 = dftest.groupby(['A','Amt']).size().reset_index(name='count')
print (df_grouped1)
A Amt count
0 1 20 3
1 1 30 4
2 1 40 2
3 2 10 2
4 2 40 3
Комментарии:
1. отлично!! решает проблему сброса индекса … есть ли лучший способ сохранить верхние n строк по группам, подсчитайте… прямо сейчас, попробовав несколько вещей, единственный возможный способ, о котором я могу думать, — это сначала groupby.value_counts, затем подмножество
2. Может быть, нужно
nlargest
—dftest.groupby(['A','Amt']).size().nlargest(3)
3. вы можете применить nlargest к groupby, поэтому можно было бы снова сгруппировать по вашему уровню 0:
df_grouped.groupby(level=0).nlargest(2)
4. «имя» не используется в более новой версии pandas: pandas.pydata.org/pandas-docs/stable/generated /…
5. Можно также использовать
dftest.groupby(['A','Amt']).size().reset_index(name='count')