每次遇到新值时,Python cumsum都会递增

时间:2017-09-18 08:57:42

标签: python r

来自R,代码将是

x       <- data.frame(vals = c(100,100,100,100,100,100,200,200,200,200,200,200,200,300,300,300,300,300))
x$state <- cumsum(c(1, diff(x$vals) != 0))

每次行之间的差异为非零时都会标记,以便我可以使用它来查找数据中的转换,如下所示:

   vals state
1   100     1
...
7   200     2
...
14  300     3

Python中什么是干净的等价物?

其他问题

原始问题的答案发布在下面,但对于带有pandas的分组数据框无效。

此处的数据:https://pastebin.com/gEmPHAb7。请注意,有2个不同的文件名。

导入为df_all时,我将其与以下内容分组,然后应用下面发布的解决方案。

df_grouped = df_all.groupby("filename")
df_all["state"] = (df_grouped['Fit'].diff() != 0).cumsum()

1 个答案:

答案 0 :(得分:1)

使用diffcumsum,与R示例一样:

df['state'] = (df['vals'].diff()!= 0).cumsum()

这使用True具有整数值1

的事实

奖金问题

df_grouped = df_all.groupby("filename")
df_all["state"] = (df_grouped['Fit'].diff() != 0).cumsum()

我认为你误解了groupby的作用。所有groupby都是基于标准创建组(在此实例中为filename)。然后,您需要告诉添加另一个操作,以告知该组需要发生什么。 常见操作为meansum或更高级applytransform。 您可以找到更多信息herehere

如果您可以详细解释您希望通过groupby实现的目标,我可以帮助您找到正确的方法。如果要对每个文件名执行上述操作,可能需要以下内容:

def get_state(group):
    return (group.diff()!= 0).cumsum()

df_all['state'] = df_all.groupby('filename')['Fit'].transform(get_state)