python - 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
解决方案
取差异和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
推荐阅读
- live - Ant Media Server 是否支持 HLS 或 DASH 中的实时 360 视频流?
- docker - 如何抑制 docker-compose 中的警告?
- c# - 如何使用一个循环遍历多个数组?
- python - autodoc 复制类的方法
- .net-core - 如何将 ILoggerFactory 添加到启动 dotnet core 3.1
- python - Python 术语 - 什么是额外的 REPL 输出?
- sql - 如何将计算列的数字格式转换为时间(hh:mm:ss)格式,sql查询
- python - 将数据从 CSV 插入 SQL(使用 Sql alchemy 或 SQL)
- java - Spark sql - 如何在按特定列分组后连接字符串行
- assembly - masm程序集如何访问结构变量