【问题标题】:How to merge/aggregate data within range of floats that is closest to the values of another column in pandas如何在最接近熊猫中另一列的值的浮点范围内合并/聚合数据
【发布时间】:2019-12-13 07:58:24
【问题描述】:

我想在共享列“time_stamp”上合并 2 个数据帧(df_a 和 df_b)。两者都包含浮点数,但 df_a 中的“time_stamp”递增 1,df_b 中的“time_stamp”递增 0.33。我想合并它们并聚合落在 df_a time_stamp 间隔内的 df_b 列的所有值(按最大值)。请指教。

df_a


time_stamp  data
0.0         b
1.0         b
2.0         c
3.0         a


df_b

time_stamp   data_x   data_y
0.33         1          0
0.66         0          0
0.99         1          0
1.32         1          3
1.65         1          0
1.98         0          0
2.31         0          0
2.64         0          0
2.97         0          0

这是所需结果的示例:

time_stamp  data  data_x  data_y
0.0          b     1        0
1.0          b     1        3
2.0          c     0        0
3.0          a    N/A      N/A

【问题讨论】:

  • 您要按 bin 进行 sum 吗?还有3.3在外面应该怎么办?
  • @user3483203 我想要每个 bin 的所有值的最大值。我正在删除 3.3,因为它与我的示例无关。谢谢你的收获。
  • 但是现在您已经从 df_a 中删除了 3,这意味着所有超过 2 的值都在您的垃圾箱之外
  • 啊,我明白你的意思了。刚刚编辑。这有意义吗?

标签: python pandas


【解决方案1】:

首先定义你想要的步骤。

step = 1 

使用步骤创建剪辑

 max_time = df['time_stamp'].max()
 #Adding the step to the max_time or it will ignore the last value
 cutp = pd.cut(df["time_stamp"], np.arange(0,max_time+step,step))

过滤器

df_grouped = df.groupby(cutp).max()

结果

            time_stamp  data_x  data_y
time_stamp
(0.0, 1.0]        0.99       1       0
(1.0, 2.0]        1.98       1       3
(2.0, 3.0]        2.97       0       0

按照应有的方式设置数据框。

df_grouped = df_grouped.drop(columns=['time_stamp']).reset_index()
df_grouped['time_stamp'] = df_grouped['time_stamp'].apply(lambda val: val.left)

治疗后的结果:

   time_stamp  data_x  data_y
0         0.0       1       0
1         1.0       1       3
2         2.0       0       0

然后合并在一起

dfa.merge(df_grouped,on='time_stamp',how='left')

结果

   time_stamp data  data_x  data_y
0         0.0    b     1.0     0.0
1         1.0    b     1.0     3.0
2         2.0    c     0.0     0.0
3         3.0    a     NaN     NaN

这似乎有点过度工作,但这个解决方案将获得 data_x 和 data_y 列的最大值,而 merge_asof 不会,根据我的测试,它只获得第一列(在这种情况下为 data_x)。

【讨论】:

  • 这太棒了,谢谢!出于好奇,除了在 max 上聚合列“data_x”和在 min 上聚合列“data_y”之外,您将如何进行相同的合并?谢谢。
  • Np,很高兴为您提供帮助,关于最小值和最大值而不是在 groupby 上使用 .max() 使用 .agg({"data_x":"max ","data_y":"min"}) 更多内容见here
猜你喜欢
  • 2017-09-26
  • 2018-02-21
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 2020-02-05
  • 1970-01-01
相关资源
最近更新 更多