首页 > 解决方案 > Pandas:根据数据的斜率分割数据框

问题描述

我有这个数据框

x = pd.DataFrame({'entity':[5,7,5,5,5,6,3,2,0,5]})

在此处输入图像描述

更新:我想要一个函数如果斜率是负数并且组的长度大于 2,那么它应该返回 True,组的开始和结束的索引。对于这种情况,它应该返回: result= True, index= 5, index=8

1-我想根据斜率分割数据框。这个例子应该有 6 个组。

2-如何检查组的长度?

在此处输入图像描述

我试图通过以下代码获取组,但我不知道如何拆分数据框以及如何检查每个部分的长度

新更新:感谢 Matt W. 的代码。最后我找到了解决方案。

df = pd.DataFrame({'entity':[5,7,5,5,5,6,3,2,0,5]})
df['diff'] = df.entity.diff().fillna(0)
df.loc[df['diff'] < 0, 'diff'] = -1

init = [0]
for x in df['diff'] == df['diff'].shift(1):
    if x:
        init.append(init[-1])
    else:
        init.append(init[-1]+1)
def get_slope(df):
    x=np.array(df.iloc[:,0].index)
    y=np.array(df.iloc[:,0])
    X = x - x.mean()
    Y = y - y.mean()
    slope = (X.dot(Y)) / (X.dot(X))
    return slope
df['g'] = init[1:]

df.groupby('g').apply(get_slope)

结果

0    NaN
1    NaN
2    NaN
3    0.0
4    NaN
5   -1.5
6    NaN

标签: pythonpandas

解决方案


取差异和bfill()开始,以便您在第 0 个元素中具有相同的数字。然后把所有的底片都一样,这样我们就可以模仿它们是相同的“斜率”。然后我将它移动以检查下一个数字是否相同,并通过给我们一个它何时更改的列表进行迭代,将其分配给g.

df = pd.DataFrame({'entity':[5,7,5,5,5,6,3,2,0,5]})
df['diff'] = df.entity.diff().bfill()
df.loc[df['diff'] < 0, 'diff'] = -1

init = [0]
for x in df['diff'] == df['diff'].shift(1):
    if x:
        init.append(init[-1])
    else:
        init.append(init[-1]+1)
df['g'] = init[1:]
df
   entity  diff  g
0       5   2.0  1
1       7   2.0  1
2       5  -1.0  2
3       5   0.0  3
4       5   0.0  3
5       6   1.0  4
6       3  -1.0  5
7       2  -1.0  5
8       0  -1.0  5
9       5   5.0  6

推荐阅读