Python 熊猫:时光倒流

Python 熊猫:时光倒流,python,pandas,Python,Pandas,我查看的是车辆的速度,唯一的数据是速度稳定、减速或停止(见下文df)。还有一个(加速),但在当前df中找不到这个 如您所见,有两个“减速”周期。我只对停止前最后一个“减速”期开始的数据感兴趣 如何筛选数据,以便删除我不感兴趣的前x行?因为速度值总是不同的,所以我不能简单地对值进行过滤 希望你能帮忙 import pandas as pd data = { "Date and Time": ["2020-06-07 00:00", "2020

我查看的是车辆的速度,唯一的数据是速度稳定、减速或停止(见下文df)。还有一个(加速),但在当前df中找不到这个

如您所见,有两个“减速”周期。我只对停止前最后一个“减速”期开始的数据感兴趣

如何筛选数据,以便删除我不感兴趣的前x行?因为速度值总是不同的,所以我不能简单地对值进行过滤

希望你能帮忙

import pandas as pd

data = {
  "Date and Time": ["2020-06-07 00:00", "2020-06-07 00:01", "2020-06-07 00:02", "2020-06-07 00:03", "2020-06-07 00:04", "2020-06-07 00:05", "2020-06-07 00:06", "2020-06-07 00:07", "2020-06-07 00:08", "2020-06-07 00:09", "2020-06-07 00:10", "2020-06-07 00:11", "2020-06-07 00:12", "2020-06-07 00:13", "2020-06-07 00:14", "2020-06-07 00:15", "2020-06-07 00:16", "2020-06-07 00:17", "2020-06-07 00:18", "2020-06-07 00:19", "2020-06-07 00:20"],

  "Values": ["Stable","Stable","Stable","Stable", "Slowing down","Slowing down","Slowing down","Stable", "Stable", "Stable", "Slowing down","Slowing down","Slowing down","Slowing down","Slowing down","Slowing down","Slowing down","Slowing down", "Stopped", "Stopped", "Stopped"]
}

df = pd.DataFrame(data)

df.head()

您可以使用then filter by
.loc
等于
减速
来获得减速周期的序列,新创建的序列是最大值:

df['SlowDownSeq'] = df['Values'].ne(df['Values'].shift()).cumsum()
df_selected = df.loc[df['SlowDownSeq'] ==  df.loc[df['Values'] == 'Slowing down', 'SlowDownSeq'].max()].drop('SlowDownSeq', axis=1)
结果:

print(df_selected)


         Date and Time        Values
10 2020-06-07 00:10:00  Slowing down
11 2020-06-07 00:11:00  Slowing down
12 2020-06-07 00:12:00  Slowing down
13 2020-06-07 00:13:00  Slowing down
14 2020-06-07 00:14:00  Slowing down
15 2020-06-07 00:15:00  Slowing down
16 2020-06-07 00:16:00  Slowing down
17 2020-06-07 00:17:00  Slowing down

根据我的理解,您需要
'Value'
'Slowing'
的行,后面紧跟着
'Stopped'

*注:我明白我误解了。您不仅需要最后一行,还需要启动
“减速”序列的所有先前连续行。我仍然会保留这个解决方案,但看起来SeaBean已经满足了您的需要

您可以创建另一列,我称之为“下一个值”
,它是一个上移1行。然后,您可以执行查询/筛选,并查找具有
'Value'
==
'Slowing'
'Next\u Value'
=
='Stopped'

import pandas as pd

data = {
  "Date and Time": ["2020-06-07 00:00", "2020-06-07 00:01", "2020-06-07 00:02", "2020-06-07 00:03", "2020-06-07 00:04", "2020-06-07 00:05", "2020-06-07 00:06", "2020-06-07 00:07", "2020-06-07 00:08", "2020-06-07 00:09", "2020-06-07 00:10", "2020-06-07 00:11", "2020-06-07 00:12", "2020-06-07 00:13", "2020-06-07 00:14", "2020-06-07 00:15", "2020-06-07 00:16", "2020-06-07 00:17", "2020-06-07 00:18", "2020-06-07 00:19", "2020-06-07 00:20"],

  "Values": ["Stable","Stable","Stable","Stable", "Slowing down","Slowing down","Slowing down","Stable", "Stable", "Stable", "Slowing down","Slowing down","Slowing down","Slowing down","Slowing down","Slowing down","Slowing down","Slowing down", "Stopped", "Stopped", "Stopped"]
}

df = pd.DataFrame(data)

df['Next_Value'] = df['Values'].shift(-1)

filtered_df = df.query('Values == "Slowing down" and Next_Value == "Stopped"')
如果您更熟悉此语法而不是df.query(),请使用以下行:

filtered_df=df[(df['Values']==“减速”)&(df['Next_Value']==“减速”)]

输出:

print(filtered_df)
       Date and Time        Values Next_Value
17  2020-06-07 00:17  Slowing down    Stopped

这应该很有用,因此换句话说,您需要从“减速”开始到“停止”的时间/行数。@chitown88是的,但只有“停止”之前的最后一个“减速”,因此忽略之前的一个(或多个,如果在另一个df中发生)。@FloLie我看到了累积计数问题,但我对第一个“减速”阶段一点也不感兴趣,这使得cumcount在本例中无关紧要。不过感谢您的评论!您可以使用cumcount,通过在“减速”中获取最大值的行号来查找最后一个“谢谢你的意见!我认为上面的解决方案对于dataframe来说稍微容易一些,但我也一定会记住这个想法:)有没有一种方法可以使用这个方法也包括“停止”值?i、 e.只删除第10行之前的所有内容,但在减速部分完成后保留所有内容?@Mel对上述逻辑进行了微调。您可以看到上面的更新版本。对于您的后续问题,是的,很简单,只需将上面代码中的
=
更改为
=
。i、 e.
df_selected=df.loc[df['slowdseq']>=df.loc[df['Values']='slowdseq'].max()。drop('slowdseq',axis=1)
import pandas as pd

data = {
  "Date and Time": ["2020-06-07 00:00", "2020-06-07 00:01", "2020-06-07 00:02", "2020-06-07 00:03", "2020-06-07 00:04", "2020-06-07 00:05", "2020-06-07 00:06", "2020-06-07 00:07", "2020-06-07 00:08", "2020-06-07 00:09", "2020-06-07 00:10", "2020-06-07 00:11", "2020-06-07 00:12", "2020-06-07 00:13", "2020-06-07 00:14", "2020-06-07 00:15", "2020-06-07 00:16", "2020-06-07 00:17", "2020-06-07 00:18", "2020-06-07 00:19", "2020-06-07 00:20"],

  "Values": ["Stable","Stable","Stable","Stable", "Slowing down","Slowing down","Slowing down","Stable", "Stable", "Stable", "Slowing down","Slowing down","Slowing down","Slowing down","Slowing down","Slowing down","Slowing down","Slowing down", "Stopped", "Stopped", "Stopped"]
}

df = pd.DataFrame(data)

df["slow_count"] = df.groupby("Values").cumcount()

a = df[(df["slow_count"] == df["slow_count"].max()) & (df["Values"] == "Slowing down" )]