【问题标题】:Is there a way to group dataframe by its values?有没有办法按数据框的值对数据框进行分组?
【发布时间】:2020-06-12 17:54:23
【问题描述】:

我有以下数据框:

Out[56]: 
   input  on_time
0      2      1.1
1      4      2.2
2      8      3.4
3      5      3.5
4      6      6.2
5     11      8.4
6     13      8.4

on_time 是我实际代码中的时间戳。我想将具有彼此接近的 on_time 值(在彼此的可配置范围内)的输入分组并将它们添加到数据帧中(其中 on_time 值是两者中的最高值)。这将导致以下数据框:

Out[60]: 
   input  on_time
0      2      1.1
1      4      2.2
2      8      3.4
3      5      3.5
4      6      6.2
5     11      8.4
6     13      8.4
7    8/5      3.5
8  11/13      8.4

我想我可以通过一些迭代和循环来做到这一点,但是有没有办法只用几行就做到这一点?

【问题讨论】:

  • 你如何定义close to each other?必须有一些限制。
  • 想象一下,您对 input=5 的第四次观察的 on_time=2.8 而不是 3.5,并且“邻居捕获半径”为 0.6。那么在附加输出中你想要什么:输入 4、8、5 的三个观察值或三个观察值中的每一个都将它与最近的邻居一起列出,然后每个有一个近邻(或最多两个,如果较高和较低的距离相等)

标签: python pandas dataframe


【解决方案1】:

sort 值,然后定义一些差异阈值,低于该阈值对值进行分组。聚合列,以便我们加入“输入”,选择 on_time 列的最大值并计算size,以便我们可以仅对具有多个值的组进行子集化。 concat 最终结果。

thresh = 0.2

df = df.sort_values('on_time')
grps = df['on_time'].diff().gt(0.2).cumsum()

res = (df.groupby(grps).agg(input=('input', lambda x: '/'.join(x.dropna().astype(str)), ),
                            on_time=('on_time', 'max'), 
                            size=('on_time', 'size')) 
         .query('size >= 2')
         .drop(columns='size'))

pd.concat([df, res], ignore_index=True)
#   input  on_time
#0      2      1.1
#1      4      2.2
#2      8      3.4
#3      5      3.5
#4      6      6.2
#5     11      8.4
#6     13      8.4
#7    8/5      3.5
#8  11/13      8.4

【讨论】:

  • 谢谢,这行得通。我不得不像这样使用它:agg(inputs=pd.NamedAgg(column = 'inputs', aggfunc = lambda x: '/'.join(x.dropna().astype(str))), on_time=pd.NamedAgg(column = 'on_time', aggfunc = 'max')
猜你喜欢
  • 1970-01-01
  • 2022-12-09
  • 2018-05-24
  • 2022-01-13
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多