繁体   English   中英

熊猫:如何在行上使用多个级别对count进行分组?

[英]Pandas: how to groupby with count with multiple levels on rows?

我有以下数据框

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

我希望按每A计算B并获得以下结果:

|----|----|-------|
| A  | B  | Count |
| a1 | b1 |  1    |
|    | b2 |  1    |
|    | b3 |  NaN  |
| a2 | b1 |  1    |
|    | b2 |  NaN  |
|    | b3 |  1    |

我通常使用df.groupby([B])[A].count()执行此操作,但在这种情况下使用有点数据透视表对我来说很困惑

提前致谢。

UPDT:

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    |

1)一种方法是对"A"进行分组,并使用value_counts计算"B"下的元素的不同计数。 然后的融合unstackstackdropna=False ,以获得所需DF

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

2) pd.crosstab也提供了一个很好的选择,如果我们替换零个计数元件np.NaN堆叠之后:

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

两种方法都产生:

在此输入图像描述


EDIT1:

要使分组键, "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"] = ""

在此输入图像描述

EDIT2:

如果您希望"A"作为单个健康单元格成为多索引DF

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

在此输入图像描述

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

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

收益:

A   B 
a1  b1    1
    b2    1
a2  b1    1
    b3    1
dtype: int64

但是,对于不存在的组合,它不会给你NaN

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM