如何在单个级别上添加新列时使用 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?的主要内容,如果未能解决你的问题,请参考以下文章
如何比较多列,并在单个新列中生成值,在 Pandas 中使用 Apply 函数
在 VB 2010 的数据表中插入新列时,如何更新 SQL Server 2008 数据库?
为啥 Django 在添加新列时会删除 SQL DEFAULT 约束?