通过在pandas中分组和聚合多列来创建新列

时间:2017-08-14 16:06:46

标签: python pandas dataframe

我有一个包含大约50列的数据框,其中一些是period_start_time,id,speed_throughput等。 dataframe sample:

    id     period_start_time         speed_througput    ...
0    1     2017-06-14 20:00:00              6
1    1     2017-06-14 20:00:00              10
2    1     2017-06-14 21:00:00              2
3    1     2017-06-14 21:00:00              5
4    2     2017-06-14 20:00:00              8
5    2     2017-06-14 20:00:00              12
...

我试图通过将两列(id和period_start_time)分组并找到speed_trhoughput的avg和min来创建两个新列。 我试过的代码:

df['Throughput_avg']=df.sort_values(['period_start_time'],ascending=False).groupby(['period_start_time','id'])[['speed_trhoughput']].max()
df['Throughput_min'] = df.groupby(['period_start_time', 'id'])[['speed_trhoughput']].min()

正如你所看到的,我尝试了两种方法,但没有任何效果。 我收到的两次尝试的错误消息:

 TypeError:incompatible index of inserted column with frame index

我想你知道我的输出需要什么,所以没有必要发布它。

1 个答案:

答案 0 :(得分:1)

选项1
agggroupby中使用join附加到主数据框

df.join(
    df.groupby(['id', 'period_start_time']).speed_througput.agg(
        ['mean', 'min']
    ).rename(columns={'mean': 'avg'}).add_prefix('Throughput_'),
    on=['id', 'period_start_time']
)

   id    period_start_time  speed_througput  Throughput_avg  Throughput_min
0   1  2017-06-14 20:00:00                6             8.0               6
1   1  2017-06-14 20:00:00               10             8.0               6
2   1  2017-06-14 21:00:00                2             3.5               2
3   1  2017-06-14 21:00:00                5             3.5               2
4   2  2017-06-14 20:00:00                8            10.0               8
5   2  2017-06-14 20:00:00               12            10.0               8

选项2
transform上下文中使用groupby并使用assign添加新列

g = df.groupby(['id', 'period_start_time']).speed_througput.transform
df.assign(Throughput_avg=g('mean'), Throughput_min=g('min'))

   id    period_start_time  speed_througput  Throughput_avg  Throughput_min
0   1  2017-06-14 20:00:00                6             8.0               6
1   1  2017-06-14 20:00:00               10             8.0               6
2   1  2017-06-14 21:00:00                2             3.5               2
3   1  2017-06-14 21:00:00                5             3.5               2
4   2  2017-06-14 20:00:00                8            10.0               8
5   2  2017-06-14 20:00:00               12            10.0               8