Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在包含关于两行的信息时对数据帧进行分组?_Python_Pandas_Dataframe_Timestamp_Pandas Groupby - Fatal编程技术网

Python 如何在包含关于两行的信息时对数据帧进行分组?

Python 如何在包含关于两行的信息时对数据帧进行分组?,python,pandas,dataframe,timestamp,pandas-groupby,Python,Pandas,Dataframe,Timestamp,Pandas Groupby,我是Python新手,希望有人能帮助我解决这个性能问题。 我的数据如下所示: TIMESTAMP A 34 2050-09-08 03:00:00 EST 3.0 40 2050-09-08 07:00:00 EST 3.0 67 2050-09-08 17:00:00 EST 6.0 84 2050-09-08 23:00:00 EST 6.0 89 2050-09-09 01:00:00 EST 11.0 103

我是Python新手,希望有人能帮助我解决这个性能问题。 我的数据如下所示:

                   TIMESTAMP   A
34   2050-09-08 03:00:00 EST   3.0
40   2050-09-08 07:00:00 EST   3.0
67   2050-09-08 17:00:00 EST   6.0
84   2050-09-08 23:00:00 EST   6.0
89   2050-09-09 01:00:00 EST  11.0
103  2050-09-09 07:00:00 EST  10.0
110  2050-09-09 11:00:00 EST  10.0
118  2050-09-09 15:00:00 EST  10.0
我想得到A列中的值稳定(S)、增加(I)或减少(D)的时间间隔

此时,我使用for循环来比较行并计算这些值之间的斜率。只要斜率的符号在每次迭代中都没有改变,间隔的结束时间戳就会得到更新。这会产生类似Interval(开始、结束、状态)的间隔。上述示例的结果是:

Interval(2050-09-08 03:00:00 EST, 2050-09-08 07:00:00 EST, S)
Interval(2050-09-08 07:00:00 EST, 2050-09-08 17:00:00 EST, I)
Interval(2050-09-08 17:00:00 EST, 2050-09-08 23:00:00 EST, S)
etc.
因为数据集包含许多行和列,所以我试图找到一种更有效地编写代码的方法(没有for循环)


在某种程度上,我希望对这些状态进行分组,获得每个状态的开始和结束时间戳,并将其保存在一个间隔中。有人知道比在数据帧中循环更快的方法吗?

这应该会有帮助。使用大量的
shift
,然后使用
groupby
+
agg

df.loc[df.A < df.A.shift(-1), 'State'] = 'I'
df.loc[df.A > df.A.shift(-1), 'State'] = 'D'
df.loc[df.A == df.A.shift(-1).ffill(), 'State'] = 'S'
df['StateGroup'] = (df.State != df.State.shift()).cumsum()
df['NextTIMESTAMP'] = df.TIMESTAMP.shift(-1).ffill()
df

这应该会有帮助。使用大量的
shift
,然后使用
groupby
+
agg

df.loc[df.A < df.A.shift(-1), 'State'] = 'I'
df.loc[df.A > df.A.shift(-1), 'State'] = 'D'
df.loc[df.A == df.A.shift(-1).ffill(), 'State'] = 'S'
df['StateGroup'] = (df.State != df.State.shift()).cumsum()
df['NextTIMESTAMP'] = df.TIMESTAMP.shift(-1).ffill()
df

这肯定很有帮助,正是我想要的。非常感谢!我有一个三对一的特别节目:df['State']=np.where(df.a.pct_change()>0,“I”,np.where(df.a.pct_change())这肯定很有用,正是我想要的。非常感谢!我有一个三对一的特别节目:df['State']=np.where(df.a.pct_change()>0,“I”,np.where(df.a.pct_change())
df.loc[df.A < df.A.shift(-1), 'State'] = 'I'
df.loc[df.A > df.A.shift(-1), 'State'] = 'D'
df.loc[df.A == df.A.shift(-1).ffill(), 'State'] = 'S'
df['StateGroup'] = (df.State != df.State.shift()).cumsum()
df['NextTIMESTAMP'] = df.TIMESTAMP.shift(-1).ffill()
df
aggs = dict(A=['mean', 'count', 'first', 'last'], State=['first'],
            TIMESTAMP={'Start': 'first'}, NextTIMESTAMP={'End': 'last'})
df.groupby('StateGroup').agg(aggs)