来自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()
答案 0 :(得分:1)
使用diff
和cumsum
,与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
)。然后,您需要告诉添加另一个操作,以告知该组需要发生什么。
常见操作为mean
,sum
或更高级apply
和transform
。
您可以找到更多信息here或here
如果您可以详细解释您希望通过groupby实现的目标,我可以帮助您找到正确的方法。如果要对每个文件名执行上述操作,可能需要以下内容:
def get_state(group):
return (group.diff()!= 0).cumsum()
df_all['state'] = df_all.groupby('filename')['Fit'].transform(get_state)