我有一个这样的df:
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列,如下所示:
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
我该怎么做呢?
发布于 2020-12-02 08:21:00
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
发布于 2020-12-02 08:18:09
像这样使用transform
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
发布于 2020-12-02 08:19:32
试试这个
(d.groupby((d['a']-1)//3)
.apply(lambda df: df.assign(b=df['b'].sum()))
.reset_index(drop = True)
)
产生
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’列
https://stackoverflow.com/questions/65100396
复制相似问题