gpt4 book ai didi

python - Pandas:使用 minrank 在 groupby 之后排名

转载 作者:行者123 更新时间:2023-12-01 07:58:28 24 4
gpt4 key购买 nike

我知道 pandas.DataFrame.groupby 中存在 rank 方法,但我想知道是否可以使用 min 对于以下问题,rank 方法可以获得与 R 编程语言相同的结果。

复制到我的 github 的数据集有几 MB。

我的尝试:

import numpy as np
import pandas as pd

flights = pd.read_csv('https://github.com/bhishanpdl/Datasets/blob/master/nycflights13.csv?raw=true')
print(flights.shape)


df = (flights[flights.tailnum.notna()]
.assign( on_time = lambda x: x.arr_time.notna() & (x.arr_delay <=0))
.groupby('tailnum')['on_time']
.agg([np.mean,'count',pd.Series.rank(method='min')]) # R uses min_rank
.set_axis(['on_time','n','rank'],axis=1,inplace=False)
.query( 'rank == 1.0')
)

df.head()

它给出了一个错误。

所需输出

shape= 336776, 19

HEAD
tailnum on_time n
N121DE 0 2
N136DL 0 1
N143DA 0 1
N17627 0 2
N240AT 0 5
N26906 0 1

TAIL
tailnum on_time n
N939DN 0 1
N943DN 0 1
N953FR 0 3
N960DN 0 3
N965DN 0 2
N978SW 0 1

R 代码运行良好,但我想使用 Pandas

library(tidyverse)
library(nycflights13)
library(dplyr)

df = flights %>%
filter(!is.na(tailnum)) %>%
mutate(on_time = !is.na(arr_time) & (arr_delay <= 0)) %>%
group_by(tailnum) %>%
summarise(on_time = mean(on_time), n = n()) %>%
filter(min_rank(on_time) == 1)


dim(flights)
head(df)
tail(df)

感谢您的帮助。

相关链接:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.groupby.GroupBy.rank.html

最佳答案

在 R 的 dplyr 中,min_rank不是聚合函数,而是聚合后的计算(实际上受到 ANSI SQL 2003 窗口函数 RANK () OVER () 的启发,它也不是聚合函数)。因此,请在聚合后的 Pandas 数据框中添加这样的计算列,而不是在 agg() 内。然后调用 reindexdrop 以排除辅助列:

df = (flights[flights.tailnum.notna()]
.assign( on_time = lambda x: x.arr_time.notna() & (x.arr_delay <=0))
.groupby('tailnum')['on_time']
.agg([np.mean, 'count'])
.set_axis(['on_time','n'],axis=1, inplace=False)
.assign(rank = lambda x: pd.Series.rank(x['on_time'], method='min'))
.query("rank == 1")
.reindex(columns=['on_time', 'n']) # OR .drop(columns=['rank'])
)

print(flights.shape)
# (336776, 19)

print(df.head())
# on_time n
# tailnum
# N121DE 0.0 2
# N136DL 0.0 1
# N143DA 0.0 1
# N17627 0.0 2
# N240AT 0.0 5

print(df.tail())
# on_time n
# tailnum
# N943DN 0.0 1
# N953FR 0.0 3
# N960DN 0.0 3
# N965DN 0.0 2
# N978SW 0.0 1

关于python - Pandas:使用 minrank 在 groupby 之后排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55832995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com