【问题标题】:Pandas groupby than cut into intervals of the min/max of the group熊猫 groupby 比切割成组的最小/最大值的间隔
【发布时间】:2022-10-07 19:26:47
【问题描述】:

我有这个数据框:

df = pd.DataFrame({\'time\' : [1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
                   \'value\' : [0.10, 0.25, 0.40, 0.24, 0.20, 0.36, 0.31, 0.20, 0.32, 0.40],
                   \'quantity_A\' : [1, 2, 3, 1, 2, 1, 1, 2, 1, 1],
                   \'quantity_B\' : [2, 2, 3, 4, 2, 2, 3, 4, 1, 1]})

看起来像这样:

   time  value  quantity_A  quantity_B
0     1   0.10           1           2
1     1   0.25           2           2
2     1   0.40           3           3
3     1   0.24           1           4
4     1   0.20           2           2
5     2   0.36           1           2
6     2   0.31           1           3
7     2   0.20           2           4
8     2   0.32           1           1
9     2   0.40           1           1

我想要这样的东西:

   time      interval  quantity_A  quantity_B
0     1    [0.1, 0.2]           3           4
1     1    (0.2, 0.3]           3           6
2     1    (0.3, 0.4]           3           3
3     2    [0.2, 0.3]           2           4
4     2    (0.3, 0.4]           4           7

或者这将是首选,但似乎更难做到,因为它不适用于 cut:

   time      interval  quantity_A  quantity_B
0     1           0.1           1           2
1     1           0.2           0           0
2     1           0.3           5           8
3     1           0.4           3           3
4     2           0.2           2           4
5     2           0.3           3           6
6     2           0.4           1           1

其中数据帧按time 分组,interval 取决于组的minmax,步长可以指定,在本例中为0.1。 quantity_Aquantity_B 应该根据它们所在的组和时间间隔进行总结。我已经设法通过迭代整个数据帧来手动完成此操作,但由于我的数据集很长,因此需要很长时间。有没有办法使用 groupbycut 等 pandas 函数来加快速度?

  • 最小参考值是否应该始终是 0.1 的倍数?不确定我理解第二个选项,你能解释一下吗?

标签: python pandas


【解决方案1】:

使用pandas.cut

step = 0.1
bins = np.arange(*df['value'].agg(['min', 'max']), step)

out = (df
   .assign(interval=pd.cut(df['value'], bins=bins, include_lowest=True))
   .drop(columns='value')
   .groupby(['time', 'interval'], as_index=False).sum()
)

输出:

   time      interval  quantity_A  quantity_B
0     1  (0.099, 0.2]           3           4
1     1    (0.2, 0.3]           3           6
2     1    (0.3, 0.4]           3           3
3     2  (0.099, 0.2]           2           4
4     2    (0.2, 0.3]           0           0
5     2    (0.3, 0.4]           4           7

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 2020-04-28
    • 1970-01-01
    • 2017-10-05
    • 2017-08-27
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多