我有一个
形式的数据帧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,例如1? 因此,对于此示例,第二行和第三行应添加到第一行,输出应为
type | time | value
------------------------
a | 1.2 | 8
a | 2.3 | 6
b | 2 | 21
b | 3 | 3
. . .
. . .
通常我只是遍历每一行,将满足约束的所有后续行的值添加到活动行,然后删除其值从数据帧添加的所有行。但我并不完全确定如何安全地与熊猫一起考虑“你永远不应该修改你正在迭代的东西。” 但遗憾的是,我也不知道如何通过同时对整个数据帧应用的任何操作来完成此操作。
编辑:我发现使用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)
如果有更快的方法可以做到这一点,我仍然会非常感兴趣,因为这种循环显然效率不高(特别是因为我使用它的那种数据帧必须迭代几万次)