当前位置: 首页 > 知识库问答 >
问题:

使用Pandas时每组最近条件行的差异

端木冷勋
2023-03-14

我有一个这样的数据帧(示例):

import pandas as pd

data = [['A', '2022-09-01', False, 2], ['A', '2022-09-02', False, 3], ['A', '2022-09-03', True, 1],
        ['A', '2022-09-05', False, 4], ['A', '2022-09-08', True, 4], ['A', '2022-09-09', False, 2],
        ['B', '2022-09-03', False, 4], ['B', '2022-09-05', True, 5], ['B', '2022-09-06', False, 7],
        ['B', '2022-09-09', True, 4], ['B', '2022-09-10', False, 2], ['B', '2022-09-11', False, 3]]
df = pd.DataFrame(data = data, columns = ['group', 'date', 'indicator', 'val'])

   group        date  indicator  val
0      A  2022-09-01      False    2
1      A  2022-09-02      False    3
2      A  2022-09-03       True    1
3      A  2022-09-05      False    4
4      A  2022-09-08       True    4
5      A  2022-09-09      False    2
6      B  2022-09-03      False    4
7      B  2022-09-05       True    5
8      B  2022-09-06      False    7
9      B  2022-09-09       True    4
10     B  2022-09-10      False    2
11     B  2022-09-11      False    3

我想创建一个名为 Diff 的列,它显示行与其最接近(取决于日期)的条件行(指标 == True)的差异,其中条件行每的值为 0。以下是所需的输出:

data = [['A', '2022-09-01', False, 2, 1], ['A', '2022-09-02', False, 3, 2], ['A', '2022-09-03', True, 1, 0],
        ['A', '2022-09-05', False, 4, 3], ['A', '2022-09-08', True, 4, 0], ['A', '2022-09-09', False, 2, -2],
        ['B', '2022-09-03', False, 4, -1], ['B', '2022-09-05', True, 5, 0], ['B', '2022-09-06', False, 7, 2],
        ['B', '2022-09-09', True, 4, 0], ['B', '2022-09-10', False, 2, -2], ['B', '2022-09-11', False, 3, -1]]
df_desired = pd.DataFrame(data = data, columns = ['group', 'date', 'indicator', 'val', 'Diff'])

   group        date  indicator  val  Diff
0      A  2022-09-01      False    2     1
1      A  2022-09-02      False    3     2
2      A  2022-09-03       True    1     0
3      A  2022-09-05      False    4     3
4      A  2022-09-08       True    4     0
5      A  2022-09-09      False    2    -2
6      B  2022-09-03      False    4    -1
7      B  2022-09-05       True    5     0
8      B  2022-09-06      False    7     2
9      B  2022-09-09       True    4     0
10     B  2022-09-10      False    2    -2
11     B  2022-09-11      False    3    -1

如您所见,它分别返回差值,最接近的指标 == 每 True 行,其中条件行的 Diff 为 0。所以我想知道是否有人知道必须使用熊猫获得所需的结果?

额外信息列Diff:

我们以A组为例。列< code>Diff由相对于指示器为True的最近的行的差来计算。比如说:

  • 第1行相对于第3行是2-1=1(基于日期的最接近True行)
  • 第2行相对于第3行为3-1=2。
  • 第4行相对于第3行为4-1=3。
  • 第6行相对于第5行为2-4=-2(基于日期,最接近True行)
  • Diff中为True的行的值为0,因为所有内容都是针对这些行计算的

共有1个答案

司徒光霁
2023-03-14

IIUC使用< code>merge_asof,通过< code>indicator过滤行,并减去< code>val列:

df['date'] = pd.to_datetime(df['date'] )

df = df.sort_values('date')

df['Diff'] = df['val'].sub(pd.merge_asof(df, 
              df[df['indicator']], on='date', by='group', direction='nearest')['val_y'])
df = df.sort_index()
 类似资料:
  • 我有以下名为df的示例数据帧(下面的< code>dput): 我想用最近的条件行计算日期之间的小时差,这些条件行的每一组都有。此外,带有TRUE的行应返回0作为输出。这里可以看到所需的输出df_desired: 所以我想知道是否有人知道如何计算每组最近的条件行的小时日期之间的差异? 这里的df和df_desired:

  • 我有以下数据帧(示例): 我想计算每组n行相对于条件行的斜率(指示符==true)。这意味着它应该返回一个列“斜率”,其中斜率在条件行之前和之后,该行的斜率应该为0。除此之外,我想返回一个名为“id”的列,它实际上是表示条件行之前(负)或之后(正)斜率的值的组id。这是所需的输出: 以下是A组的一些解释: 第0,1和2行是斜率为(x=[-3,-2,-1], y=[2,1,1])=-0.5的条件行(

  • 问题内容: 假设我有这样的pandas DataFrame: 我想获得一个新的DataFrame,其中每个ID的前2个记录如下: 我可以对分组依据中的记录进行编号: 但是,有没有更有效/更优雅的方法来做到这一点?还有一种更优雅的方法来对每个组中的数字进行记录(例如SQL窗口函数row_number())。 问题答案: 你试过了吗 Ouput生成: (请记住,根据数据,你可能需要先进行订购/排序)

  • 问题内容: 我有一张用户签入和签出时间的表(“ lms_attendance”),如下所示: 我正在尝试创建此表的视图,该表将仅输出每个用户ID的最新记录,同时给我“ in”或“ out”值,如下所示: 到目前为止,我已经很接近了,但是我意识到视图将不接受子查询,这使它变得更加困难。我得到的最接近的查询是: 但是我得到的是: 这很接近,但并不完美。我知道最后一个分组依据不应存在,但是如果没有它,它

  • 问题内容: 我有一个由DatetimeIndex索引的Pandas数据框: 我想找到最接近特定时间的行: 并找到它有多近。到目前为止,我已经基于从所有时间中减去我想要的时间并找到最小的绝对值的想法进行了各种尝试,但是似乎没有一个奏效。 例如: 给出一个错误,我认为是由于Datetime索引上的+/-发生了偏移,因此我尝试将索引放入另一列中,然后进行处理: 这似乎可行,但是要做我想做的事,我需要得到

  • 我需要按键值保留输入xml分组中的最新条目。可以用xsl 2.0实现吗?输入