Pandas 按 cumsum 分组保留列
Pandas group by cumsum keep columns
我现在花了几个小时尝试在 pandas 数据帧上执行 "cumulative group by sum"。我查看了所有 Whosebug 的答案,令人惊讶的是 none 可以解决我的(非常初级的)问题:
我有一个数据框:
df1
Out[8]:
Name Date Amount
0 Jack 2016-01-31 10
1 Jack 2016-02-29 5
2 Jack 2016-02-29 8
3 Jill 2016-01-31 10
4 Jill 2016-02-29 5
我正在尝试
- 按 ['Name'、'Date'] 和
分组
- 总和 'Amount'.
- 就是这样。
所以期望的输出是:
df1
Out[10]:
Name Date Cumsum
0 Jack 2016-01-31 10
1 Jack 2016-02-29 23
2 Jill 2016-01-31 10
3 Jill 2016-02-29 15
编辑:我正在简化问题。根据目前的答案,我仍然无法获得正确的 "running" cumsum。仔细看,我要看的是累计和“10、23、10、15”。换句话说,我想在每个连续的日期看到一个人的总累计金额。注意:如果同一个人在一个日期有两个条目,我想将它们相加,然后将它们添加到 运行 cumsum 中,然后才打印总和。
您需要将输出分配给新列,然后通过 drop
:
删除 Amount
列
df1['Cumsum'] = df1.groupby(by=['Name','Date'])['Amount'].cumsum()
df1 = df1.drop('Amount', axis=1)
print (df1)
Name Date Cumsum
0 Jack 2016-01-31 10
1 Jack 2016-02-29 5
2 Jack 2016-02-29 13
3 Jill 2016-01-31 10
4 Jill 2016-02-29 5
另一个 assign
的解决方案:
df1 = df1.assign(Cumsum=df1.groupby(by=['Name','Date'])['Amount'].cumsum())
.drop('Amount', axis=1)
print (df1)
Name Date Cumsum
0 Jack 2016-01-31 10
1 Jack 2016-02-29 5
2 Jack 2016-02-29 13
3 Jill 2016-01-31 10
4 Jill 2016-02-29 5
通过评论编辑:
首先 groupby
列 Name
和 Date
并聚合 sum
,然后 groupby
level
Name
并聚合cumsum
.
df = df1.groupby(by=['Name','Date'])['Amount'].sum()
.groupby(level='Name').cumsum().reset_index(name='Cumsum')
print (df)
Name Date Cumsum
0 Jack 2016-01-31 10
1 Jack 2016-02-29 23
2 Jill 2016-01-31 10
3 Jill 2016-02-29 15
先设置索引,再设置groupby。
df.set_index(['Name', 'Date']).groupby(level=[0, 1]).Amount.cumsum().reset_index()
OP 更改了他们的问题后,现在这是正确答案。
df1.groupby(
['Name','Date']
)Amount.sum().groupby(
level='Name'
).cumsum()
这与 jezrael 提供的答案相同
我现在花了几个小时尝试在 pandas 数据帧上执行 "cumulative group by sum"。我查看了所有 Whosebug 的答案,令人惊讶的是 none 可以解决我的(非常初级的)问题:
我有一个数据框:
df1
Out[8]:
Name Date Amount
0 Jack 2016-01-31 10
1 Jack 2016-02-29 5
2 Jack 2016-02-29 8
3 Jill 2016-01-31 10
4 Jill 2016-02-29 5
我正在尝试
- 按 ['Name'、'Date'] 和 分组
- 总和 'Amount'.
- 就是这样。
所以期望的输出是:
df1
Out[10]:
Name Date Cumsum
0 Jack 2016-01-31 10
1 Jack 2016-02-29 23
2 Jill 2016-01-31 10
3 Jill 2016-02-29 15
编辑:我正在简化问题。根据目前的答案,我仍然无法获得正确的 "running" cumsum。仔细看,我要看的是累计和“10、23、10、15”。换句话说,我想在每个连续的日期看到一个人的总累计金额。注意:如果同一个人在一个日期有两个条目,我想将它们相加,然后将它们添加到 运行 cumsum 中,然后才打印总和。
您需要将输出分配给新列,然后通过 drop
:
Amount
列
df1['Cumsum'] = df1.groupby(by=['Name','Date'])['Amount'].cumsum()
df1 = df1.drop('Amount', axis=1)
print (df1)
Name Date Cumsum
0 Jack 2016-01-31 10
1 Jack 2016-02-29 5
2 Jack 2016-02-29 13
3 Jill 2016-01-31 10
4 Jill 2016-02-29 5
另一个 assign
的解决方案:
df1 = df1.assign(Cumsum=df1.groupby(by=['Name','Date'])['Amount'].cumsum())
.drop('Amount', axis=1)
print (df1)
Name Date Cumsum
0 Jack 2016-01-31 10
1 Jack 2016-02-29 5
2 Jack 2016-02-29 13
3 Jill 2016-01-31 10
4 Jill 2016-02-29 5
通过评论编辑:
首先 groupby
列 Name
和 Date
并聚合 sum
,然后 groupby
level
Name
并聚合cumsum
.
df = df1.groupby(by=['Name','Date'])['Amount'].sum()
.groupby(level='Name').cumsum().reset_index(name='Cumsum')
print (df)
Name Date Cumsum
0 Jack 2016-01-31 10
1 Jack 2016-02-29 23
2 Jill 2016-01-31 10
3 Jill 2016-02-29 15
先设置索引,再设置groupby。
df.set_index(['Name', 'Date']).groupby(level=[0, 1]).Amount.cumsum().reset_index()
OP 更改了他们的问题后,现在这是正确答案。
df1.groupby(
['Name','Date']
)Amount.sum().groupby(
level='Name'
).cumsum()
这与 jezrael 提供的答案相同