首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >熊猫:一组接一组地使用最小等级

熊猫:一组接一组地使用最小等级
EN

Stack Overflow用户
提问于 2019-04-24 14:53:54
回答 1查看 220关注 0票数 1

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

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

我的尝试:

代码语言:javascript
运行
复制
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()

它带来了一个错误。

所需输出

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-24 17:32:46

在R的dplyr中,min_rank不是聚合函数,而是聚合后的计算(实际上是受ANSISQL2003Window函数的启发,RANK () OVER ()也不是聚合函数)。因此,在agg()之外的聚合之后,在Pandas数据帧中添加这样的计算列。然后调用reindexdrop以排除助手列:

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55832995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档