提问人:muon 提问时间:9/30/2016 最后编辑:cottontailmuon 更新时间:3/18/2023 访问量:76293
熊猫reset_index后groupby.value_counts()
pandas reset_index after groupby.value_counts()
问:
我正在尝试按一列分组并计算另一列的值计数。
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
答:
68赞
jezrael
9/30/2016
#1
您需要reset_index
中的参数,因为 name 与以下级别之一的名称相同:name
Series
MultiIndex
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,然后子集
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_index
groupby.size
as_index=False
groupby.size
value_counts
dftest.groupby(['A','Amt'], as_index=False).size()
由于 pandas 1.1.,是一个冗余操作,因为可以直接在 DataFrame 上调用并产生相同的输出。groupby.value_counts
value_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)
上一个:按 row.names 子集矩阵
下一个:删除具有 nan 值的行
评论
dftest.groupby('A', as_index=False)
reset_index()