如何根据列值从数据序列中提取第一个和最后一个值?

How to extract the first and last value from a data sequence based on a column value?

我有一个可以使用以下代码创建的时间序列数据集。

idx = pd.date_range("2018-01-01", periods=100, freq="H")
ts = pd.Series(idx)
dft = pd.DataFrame(ts,columns=["date"])
dft["data"] = ""

dft["data"][0:5]= "a"
dft["data"][5:15]= "b"
dft["data"][15:20]= "c"
dft["data"][20:30]= "d"
dft["data"][30:40]= "a"
dft["data"][40:70]= "c"
dft["data"][70:85]= "b"
dft["data"][85:len(dft)]= "c"

在数据列中,唯一值为a,b,c,d。这些值在不同的时间按顺序重复 windows。 我想捕获那个时间的第一个和最后一个值window。我该怎么做?

使用 shift 为您的变化值计算一个石斑鱼来比较连续的行,然后使用 groupby+agg 得到每组 min/max:

group = dft.data.ne(dft.data.shift()).cumsum()
dft.groupby(group)['date'].agg(['min', 'max'])

输出:

                     min                 max
data                                        
1    2018-01-01 00:00:00 2018-01-01 04:00:00
2    2018-01-01 05:00:00 2018-01-01 14:00:00
3    2018-01-01 15:00:00 2018-01-01 19:00:00
4    2018-01-01 20:00:00 2018-01-02 05:00:00
5    2018-01-02 06:00:00 2018-01-02 15:00:00
6    2018-01-02 16:00:00 2018-01-03 21:00:00
7    2018-01-03 22:00:00 2018-01-04 12:00:00
8    2018-01-04 13:00:00 2018-01-05 03:00:00

编辑。结合原始数据:

dft.groupby(group).agg({'data': 'first', 'date': ['min', 'max']})

输出:

      data                date                    
     first                 min                 max
data                                              
1        a 2018-01-01 00:00:00 2018-01-01 04:00:00
2        b 2018-01-01 05:00:00 2018-01-01 14:00:00
3        c 2018-01-01 15:00:00 2018-01-01 19:00:00
4        d 2018-01-01 20:00:00 2018-01-02 05:00:00
5        a 2018-01-02 06:00:00 2018-01-02 15:00:00
6        c 2018-01-02 16:00:00 2018-01-03 21:00:00
7        b 2018-01-03 22:00:00 2018-01-04 12:00:00
8        c 2018-01-04 13:00:00 2018-01-05 03:00:00