如何在单个级别上添加新列时使用 pandas group-by?

Posted

技术标签:

【中文标题】如何在单个级别上添加新列时使用 pandas group-by?【英文标题】:How can use pandas group-by while adding new columns on a single level? 【发布时间】:2018-03-01 18:57:34 【问题描述】:

原始数据是这样的:

    Date        E   
0   2017-09-01  -   
1   2017-09-01  +   
2   2017-09-01  +   
3   2017-09-01  +  
...
... 

应用groupby后:

df.groupby(['Date', 'E'])['Date'].count().to_frame(name = 'Count').reset_index()

我得到一个如下所示的数据框:

    Date        E   Count
0   2017-09-01  +   11
1   2017-09-01  -   1
2   2017-09-04  +   1
3   2017-09-04  -   7
4   2017-09-05  +   1
5   2017-09-05  -   23

如何将其转换为如下所示的数据框:

    Date        +   -
0   2017-09-01  11  1
2   2017-09-04  1   7
4   2017-09-05  1   23

【问题讨论】:

【参考方案1】:

我认为使用GroupBy.size 更好,因为GroupBy.count 用于计数非NaN 值。

然后通过unstack重塑:

df = df.groupby(['Date', 'E'])['Date'].size().unstack(fill_value=0).reset_index()
print (df)
E        Date  +  -
0  2017-09-01  3  1

更少的打字解决方案,但在较大的 df 中较慢的是crosstab

df = pd.crosstab(df['Date'], df['E'])
print (df)
E           +  -
Date            
2017-09-01  3  1

【讨论】:

【参考方案2】:

或者,使用pd.crosstab

In [1736]: pd.crosstab(df.Date, df.E)
Out[1736]:
E           +  -
Date
2017-09-01  3  1
2017-09-02  1  0

或者,pivot_table

In [1737]: pd.pivot_table(df, index=['Date'], columns=['E'], aggfunc=len, fill_value=0)
Out[1737]:
E           +  -
Date
2017-09-01  3  1
2017-09-02  1  0

【讨论】:

以上是关于如何在单个级别上添加新列时使用 pandas group-by?的主要内容,如果未能解决你的问题,请参考以下文章

在 Mysql 中添加新列时如何轻松维护审计触发器

如何比较多列,并在单个新列中生成值,在 Pandas 中使用 Apply 函数

在 VB 2010 的数据表中插入新列时,如何更新 SQL Server 2008 数据库?

为啥 Django 在添加新列时会删除 SQL DEFAULT 约束?

将 uuid 添加到 pandas DataFrame 中的新列

添加新列时在alembic中设置列顺序