根据panda df的重复列值分组,对其他列求和/求平均值



我有一个df,如下所示:

Activity    Count   angle_1frame_abs
87  11.2454 4   1.9863239600400613
88  14.3124 4   1.633204419481332
89  7.15621 4   1.7235925045363631
90  1.02232 4   1.4205234792290875
172 6.13389 1   1.9096280055821166
187 1.02232 3   1.7052938965382456
188 7.15621 3   1.708833899378485
189 2.04463 3   1.2728507985832682
233 4.08926 1   1.554572584797844
265 4.08926 2   1.512615236089327
266 5.11157 2   1.4850900583919704
281 6.13389 1   1.162132169753371
305 3.06694 2   2.3605660470439824
306 3.06694 2   1.5685525010916657
385 5.11157 2   1.6579646804948973
386 2.04463 2   2.121520877298791
407 5.11157 4   1.1528498264361269
408 12.2678 4   1.7986876725933032
409 9.20082 4   1.5502484587771188
410 2.04463 4   1.6302871732665316 

列";计数";有一些重复值,我想用这些值对df进行分组。

在上面的例子中,我有8组。

我很难将价值观作为独立的群体来重复。

我的最终目标是根据这些组对其他列进行平均(Activity(或求和(angle_1frame_abs(。

我想要的输出是这样的(注意:activity和angle_1frames_abs值是由两个值组成的(:

Activity Count angle_1_frames_abs
9   4   1.7
6   1   1.9 
4   3   1.7
4   1   1.5
4   2   1.4
6   1   1.1
4   2   1.5
8   4   1.5

我一直在尝试这样的东西,但这只给了我基于";计数";柱

df.groupby(["Count"]).angle_1frame_abs.sum().reset_index()

您可以使用diff+ne+cumsum创建组。其想法是检查该值是否连续出现,如果不连续,则检查其中断的位置。然后cumsum用于为组分配不同的数值:

groups = df['Count'].diff().ne(0).cumsum()

根据给定的输入,这将创建:

87     1
88     1
89     1
90     1
172    2
187    3
188    3
189    3
233    4
265    5
266    5
281    6
305    7
306    7
385    7
386    7
407    8
408    8
409    8
410    8

注意,这将";计数";即使它们是相同的,只要它们不是连续的。

然后,这些新组可以在df上使用groupby。例如;活动";每组为:

out = df.groupby(groups)['Activity'].mean()
Count
1    8.434083
2    6.133890
3    3.407720
4    4.089260
5    4.600415
6    6.133890
7    3.322520
8    7.156205

此外,如果原始分组列不是数字列(或数据类型的混合(,则可以使用shift(感谢@StevenS(:

df['count'].ne(df['count'].shift()).fillna(0).cumsum().astype(int)

您可以定义要在聚合函数中保留的每一列:

df.groupby(["Count"]).agg({k: ['sum', 'mean'] for k in df.columns}).reset_index()

这里的代码计算每个组中每列的总和和平均值,因此这只适用于只有数字列的数据帧
这是一个适用于群组streches的版本:

# firstly, create a helper column called "groups" (this col will signify
# when a value is changed in the Count column):
df['groups'] = None
group = 0
for i, j in df.iterrows():
if i == 0:
df.loc[i, 'groups'] = group
valueBefore = df.loc[i, 'Count']
continue
if j.loc['Count'] != valueBefore:
group += 1
df.loc[i, 'groups'] = group
valueBefore = df.loc[i, 'Count']
# then you can use it to groupby all other columns, i.e.:
df.groupby(["groups"]).agg({k: ['sum', 'mean'] for k in df.columns}).reset_index()

最新更新