Pandas基于列值的度量求和行

2024-09-24 22:18:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧df的形式

 type  | time   | value
------------------------
  a    |    1.2 |  1
  a    |    1.3 |  3
  a    |    2.1 |  4
  a    |    2.3 |  6
  b    |    2   |  21
  b    |    3   |  3
  .         .      .
  .         .      .

对于所有行,是否有任何可行的方法来合并(求和)给定类型中时间戳差小于(例如1)的所有后续行? 所以在这个例子中,第二行和第三行应该添加到第一行,输出应该是

 type  | time   | value
------------------------
  a    |    1.2 |  8
  a    |    2.3 |  6
  b    |    2   |  21
  b    |    3   |  3
  .         .      .
  .         .      .

通常,我只需迭代每一行,将满足约束的所有后续行的值添加到活动行,然后删除从dataframe添加值的所有行。但考虑到“您永远不应该修改您正在迭代的内容”,我不完全确定如何安全地使用panda 但遗憾的是,我也不明白如何用一次应用于整个数据帧的任何操作来实现这一点。你知道吗

编辑:我发现了一个非常粗略的方法来使用while循环。在每次迭代中,它只会将下一行添加到之前没有时间戳小于1的相同类型行的行中:

df['nexttime']= df['time'].shift(-1)
df['nexttype']= df['type'].shift(-1)
df['lasttime']= df['time'].shift(1)
df['lasttype']= df['type'].shift(1)
df['nextvalue'] = df['value'].shift(-1)

while df.loc[(df.type == df.nexttype) & ((df.time - df.lasttime >1) | (df.type != df.lasttype)) &  (df.time - df.nexttime <=1 ),'value'].any():
    df.loc[(df.type == df.nexttype) & ((df.time - df.lasttime >1 ) | (df.type != df.lasttype)) &  (df.time - df.nexttime <=1  ),'value'] = df.loc[(df.type == df.nexttype) & ((df.time - df.lasttime >1 ) | (df.type != df.lasttype)) &  (df.time - df.nexttime <=1  ),'value'] + df.loc[(df.type == df.nexttype) & ((df.time - df.lasttime >1 ) | (df.type != df.lasttype)) &  (df.time - df.nexttime <=1  ),'nextvalue']
    df = df.loc[~((df.shift(1).type == df.shift(1).nexttype) & ((df.shift(1).time - df.shift(1).lasttime >1 ) | (df.shift(1).type != df.shift(1).lasttype)) &  (df.shift(1).time - df.shift(1).nexttime <=1  ))]
    df['nexttime']= df['time'].shift(-1)
    df['nexttype']= df['type'].shift(-1)
    df['lasttime']= df['time'].shift(1)
    df['lasttype']= df['type'].shift(1)
    df['nextvalue'] = df['value'].shift(-1)

如果有更快的方法,我还是会很感兴趣的,因为这种循环显然不是很有效(特别是对于我使用的数据帧,它必须迭代数万次)。你知道吗


Tags: 数据方法类型dfshifttimevaluetype