熊猫-根据其他列的分组添加列

时间:2020-02-19 15:20:06

标签: python pandas

我想使用pandas和python添加三列。我不确定如何根据具有相同GroupID值的行添加其他列。

  • min_avg :对于具有相同GroupID的行,这是最低的 avg
  • max_avg :对于具有相同GroupID的行,这是最高的 avg
  • group_avg :这是每行“ min_avg ”和“ max_avg ”列中的平均价值

我不完全确定从哪里开始。

我有这个:

    avg     groupId
0   25.5    1016
1   26.7    1048
2   25.8    1016
3   53.5    1048
4   29.3    1064
5   27.7    1016

我的目标是:

    avg         groupId     min_avg     max_avg     group_average
0   25.5        1016        25.5        27.7        26.6
1   26.7        1048        26.3        53.5        39.9
2   25.8        1016        25.5        27.7        26.6
3   53.5        1048        26.3        53.5        39.9
4   29.3        1064        29.3        29.3        29.3
5   27.7        1016        25.5        27.7        26.6

2 个答案:

答案 0 :(得分:4)

我们可以用merge groupbydescribe

df=df.merge(df.groupby('groupId').avg.describe()[['mean','min','max']].reset_index(),how='left')
Out[25]: 
    avg  groupId       mean   min   max
0  25.5     1016  26.333333  25.5  27.7
1  26.7     1048  40.100000  26.7  53.5
2  25.8     1016  26.333333  25.5  27.7
3  53.5     1048  40.100000  26.7  53.5
4  29.3     1064  29.300000  29.3  29.3
5  27.7     1016  26.333333  25.5  27.7

答案 1 :(得分:2)

YOBEN_S解决方案中给出的describe方法将计算出比所需数量更多的统计信息,包括countstddtypes。参见here

我们可以使用agg方法来解决这个问题。

df.merge(df.groupby('groupId')['avg'].agg([min, max, 'mean']), on='groupId')

# output
avg groupId min max mean
0   25.5    1016    25.5    27.7    26.333333
1   26.7    1048    26.7    53.5    40.100000
2   25.8    1016    25.5    27.7    26.333333
3   53.5    1048    26.7    53.5    40.100000
4   29.3    1064    29.3    29.3    29.300000
5   27.7    1016    25.5    27.7    26.333333

速度比较

方法1

%%timeit -n 1000

df.merge(df.groupby('groupId').avg.describe()[['mean','min','max']].reset_index(),how='left')

每个循环9.6 ms±123 µs(平均±标准偏差,共运行7次,每个循环1000次)

方法2

%%timeit -n 1000

df.merge(df.groupby('groupId')['avg'].agg([min, max, 'mean']), on='groupId')

每个循环3.42 ms±74.4 µs(平均±标准偏差,共运行7次,每个循环1000次)

方法3

此外,我们可以通过将df.merge转换为df.join来略微加快速度。

每个循环2.96 ms±29.3 µs(平均±标准偏差,共运行7次,每个循环1000次)