Pandas:如何在行上有多个级别的count分组?

2024-10-01 11:30:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧

|----|----|
| A  | B  |
| a1 | b1 |
| a2 | b1 |
| a1 | b2 |
| a2 | b3 |

我想用BperA进行计数,得到以下结果:

^{pr2}$

我通常用df.groupby([B])[A].count()来做这件事,但在这种情况下,它有点像透视表,这让我很困惑

提前谢谢。在

更新日期:

df.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 20422 entries, 180 to 96430
Data columns (total 2 columns):
B    20422 non-null object
A             20422 non-null object
dtypes: object(2)
memory usage: 478.6+ KB

我正在处理df.groupby([B])[A].value_counts().unstack().stack(dropna=False).reset_index(name="Count")

|--|----|----|-------|
|  | A  | B  | Count |
|0 | a1 | b1 |  1    |
|1 | a1 | b2 |  1    |
|2 | a1 | b3 |  NaN  |
|3 | a2 | b1 |  1    |
|4 | a2 | b2 |  NaN  |
|5 | a2 | b3 |  1    |

Tags: columns数据a2dfobjecta1countnan
2条回答

1)一种方法是对"A"进行分组,并使用^{}计算"B"下元素的不同计数。然后将unstack和{}与{}融合,得到所需的{}:

df.groupby('A')['B'].value_counts().unstack().stack(dropna=False).reset_index(name="Count")

2)^{}也提供了一个很好的替代方案,如果我们在堆叠后用np.NaN替换零计数元素:

^{pr2}$

两种方法都会产生:

enter image description here


编辑1:

要使分组键,"A"以某种格式显示(即保留第一个出现的项,同时用空字符串替换其余项)

df_g = pd.crosstab(df['A'], df['B']).stack().replace({0:np.nan}).reset_index(name="Count")
df_g.loc[df_g.duplicated('A'), "A"] = ""

enter image description here

编辑2:

如果您希望"A"作为多索引DF的一部分的单个健康单元格:

df.groupby('A')['B'].value_counts().unstack().stack(dropna=False
                    ).reset_index(name="Count").set_index(['A', 'B'])

enter image description here

您可以按两列分组并访问每个组的大小:

 df.groupby(['A', 'B']).size()

退货:

^{pr2}$

但对于不存在的组合,它不会给出NaN。在

相关问题 更多 >