Python 如何在包含关于两行的信息时对数据帧进行分组?
我是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
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)