熊猫reset_index后groupby.value_counts()

pandas reset_index after groupby.value_counts()

提问人:muon 提问时间:9/30/2016 最后编辑:cottontailmuon 更新时间:3/18/2023 访问量:76293

问:

我正在尝试按一列分组并计算另一列的值计数。

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]})

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()

它给出以下错误

ValueError: cannot insert Amt, already exists
Python Pandas DataFrame 操作 数据 科学

评论

3赞 DivyaJyoti Rajdev 9/17/2019
如果你这样做,你就不需要了dftest.groupby('A', as_index=False)reset_index()

答:

68赞 jezrael 9/30/2016 #1

您需要reset_index中的参数,因为 name 与以下级别之一的名称相同:nameSeriesMultiIndex

df_grouped.reset_index(name='count')

另一种解决方案是重命名名称:Series

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

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

评论

0赞 muon 9/30/2016
完善!!解决了重置索引问题...有没有更好的方法来按组保留前 N 行,计数......现在,在尝试了几件事之后,我能想到的唯一可能方法是先groupby.value_counts,然后子集
0赞 jezrael 9/30/2016
也许需要 nlargest - dftest.groupby(['A','Amt']).size().nlargest(3)
2赞 Zeugma 9/30/2016
您可以将 nmost 应用于 groupby,因此一种方法是针对您的级别 0 再次分组:df_grouped.groupby(level=0).nlargest(2)
5赞 Mermoz 5/29/2018
“name”在较新版本的 pandas 中被弃用:pandas.pydata.org/pandas-docs/stable/generated/...
1赞 Sheldore 5/14/2020
也可以使用dftest.groupby(['A','Amt']).size().reset_index(name='count')
1赞 cottontail 3/18/2023 #2

为了完全避免,可以与参数一起使用( 产生相同的输出 - 无论如何,默认情况下都会删除 NaN)。reset_indexgroupby.sizeas_index=Falsegroupby.sizevalue_counts

dftest.groupby(['A','Amt'], as_index=False).size()

由于 pandas 1.1.,是一个冗余操作,因为可以直接在 DataFrame 上调用并产生相同的输出。groupby.value_countsvalue_counts()

dftest.value_counts(['A', 'Amt']).reset_index(name='count')

从 pandas 1.5. 开始,admits 参数,该参数可能被标记为允许重复的列名(如 OP 中所示):reset_index()allow_duplicates=

grouper = dftest.groupby('A')
grouper['Amt'].value_counts().reset_index(allow_duplicates=True)