首页 > 解决方案 > 使用唯一时间戳的子集 df - pandas

问题描述

我的目标是仅在 df 中返回与前两个唯一时间戳关联的行。但是,在下面,我将返回每个时间戳的前两个。

df1 = pd.DataFrame({  
        'Time' : ['2019-08-02 09:50:10.100','2019-08-02 09:50:10.100','2019-08-02 09:50:10.100','2019-08-02 09:50:10.200','2019-08-02 09:50:10.200','2019-08-02 09:50:10.200','2019-08-02 09:50:10.300','2019-08-02 09:50:10.300','2019-08-02 09:50:10.300'],                                     
        })

df1['Time'] = pd.to_datetime(df1['Time'])

df1 = df1.groupby(['Time']).head(2)

故意的:

                     Time
0 2019-08-02 09:50:10.100
1 2019-08-02 09:50:10.100
2 2019-08-02 09:50:10.200
3 2019-08-02 09:50:10.200

标签: pythonpandas

解决方案


尝试过滤groupby ngroup小于 2:

new_df = df1[df1.groupby('Time').ngroup().lt(2)]

new_df

                     Time
0 2019-08-02 09:50:10.100
1 2019-08-02 09:50:10.100
2 2019-08-02 09:50:10.100
3 2019-08-02 09:50:10.200
4 2019-08-02 09:50:10.200
5 2019-08-02 09:50:10.200

groupby ngroup为每个时间创建组号:

0    0
1    0
2    0
3    1
4    1
5    1
6    2
7    2
8    2
dtype: int64

然后仅选择与第 0 次和第 1 次关联的行。( lt 2) 或 ( le 1)


或使用unique前 2 个切片获取唯一时间值,然后用于isin测试时间值:

new_df = df1[df1['Time'].isin(df1['Time'].unique()[:2])]

new_df

                     Time
0 2019-08-02 09:50:10.100
1 2019-08-02 09:50:10.100
2 2019-08-02 09:50:10.100
3 2019-08-02 09:50:10.200
4 2019-08-02 09:50:10.200
5 2019-08-02 09:50:10.200

推荐阅读