数据框中日期组内的分类排序

问题描述 投票:0回答:1

我有一个像这样的数据框,并且想确保按日期对其进行排序并具有 状态条目的侧面顺序相同,我希望每个日期的 S 之前看到 B 条目。但也要保留只有一个条目的日期。

tempDF = pd.DataFrame({ 'id': [12,12,12,12,45,45,45,51,51,51,51,51,51,76,76,76],
                'date': ['2015-05-01','2015-05-22','2015-05-14','2015-05-06','2015-05-03','2015-05-12','2015-05-02','2015-05-05','2015-05-01','2015-05-23','2015-05-17','2015-05-03','2015-05-05','2015-05-04','2015-05-22','2015-05-08'],
                'status': ['B','S','B','S','B','B','S','B','S','B','B','S','S','B','B','S']})
tempDF['date'] = pd.to_datetime(tempDF['date'])

我试过了

tempDF.sort_values(['status']).groupby(tempDF['date']).head(2)

但这最终会在分组之前对条目进行排序

pandas sorting group-by
1个回答
1
投票

如果我理解正确的话,首先

sort_values
然后
grouby.head
sort=False

(tempDF.sort_values(by=['date', 'status'], ascending=True)
       .groupby('date', sort=False).head(2)
)

输出:

    id       date status
0   12 2015-05-01      B
8   51 2015-05-01      S
6   45 2015-05-02      S
4   45 2015-05-03      B
11  51 2015-05-03      S
13  76 2015-05-04      B
7   51 2015-05-05      B
12  51 2015-05-05      S
3   12 2015-05-06      S
15  76 2015-05-08      S
5   45 2015-05-12      B
2   12 2015-05-14      B
10  51 2015-05-17      B
14  76 2015-05-22      B
1   12 2015-05-22      S
9   51 2015-05-23      B

同样,如果您希望所有 B 都在所有 S 之前:

tempDF.sort_values(by=['status', 'date'], ascending=True)
       .groupby('date', sort=False).head(2)
)

输出:

    id       date status
0   12 2015-05-01      B
4   45 2015-05-03      B
13  76 2015-05-04      B
7   51 2015-05-05      B
5   45 2015-05-12      B
2   12 2015-05-14      B
10  51 2015-05-17      B
14  76 2015-05-22      B
9   51 2015-05-23      B
8   51 2015-05-01      S
6   45 2015-05-02      S
11  51 2015-05-03      S
12  51 2015-05-05      S
3   12 2015-05-06      S
15  76 2015-05-08      S
1   12 2015-05-22      S
© www.soinside.com 2019 - 2024. All rights reserved.