首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在pandas中如何每隔n行分组并求和但保持原始结构

在pandas中如何每隔n行分组并求和但保持原始结构
EN

Stack Overflow用户
提问于 2020-12-02 08:07:12
回答 5查看 127关注 0票数 1

我有一个这样的df:

代码语言:javascript
复制
d = pd.DataFrame(list(zip(list(range(1,10)), list(range(11,20)))), columns=['a', 'b'])
print(d)



  a   b
0  1  11
1  2  12
2  3  13
3  4  14
4  5  15
5  6  16
6  7  17
7  8  18
8  9  19

我想在b列中每隔3行分组一次,并得到总和。但是,我不想将df折叠为groupby索引。我想保留原来的a列,但我想用该行所属组的和值替换b列,如下所示:

代码语言:javascript
复制
d_ = pd.DataFrame(list(zip(list(range(1,10)), [36, 36, 36, 45, 45, 45, 54, 54, 54])), columns=['a', 'b'])
print(d_)


   a   b
0  1  36
1  2  36
2  3  36
3  4  45
4  5  45
5  6  45
6  7  54
7  8  54
8  9  54

我该怎么做呢?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2020-12-02 08:21:00

代码语言:javascript
复制
d=d.assign(b=d.groupby(d.index//3)['b'].transform('sum'))



  a   b
0  1  36
1  2  36
2  3  36
3  4  45
4  5  45
5  6  45
6  7  54
7  8  54
8  9  54
票数 2
EN

Stack Overflow用户

发布于 2020-12-02 08:18:09

像这样使用transform

代码语言:javascript
复制
In [5]: d.groupby(d.index // 3).transform('sum')
Out[5]: 
    a   b
0   6  36
1   6  36
2   6  36
3  15  45
4  15  45
5  15  45
6  24  54
7  24  54
8  24  54
票数 1
EN

Stack Overflow用户

发布于 2020-12-02 08:19:32

试试这个

代码语言:javascript
复制
(d.groupby((d['a']-1)//3)
    .apply(lambda df: df.assign(b=df['b'].sum()))
    .reset_index(drop = True)
    )

产生

代码语言:javascript
复制
    a   b
0   1   36
1   2   36
2   3   36
3   4   45
4   5   45
5   6   45
6   7   54
7   8   54
8   9   54

在这里,我们通过3s进行groupby ( by列表看起来像[0,0,0,1,1,1,2,2,2,...]),然后我们将函数.assign(b=df['b'].sum())应用于每个子组,该函数用该子组中'b‘值的总和替换'b’列

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65100396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档