python - 在 pandas groupby 之后只过滤少数组元素

标签 python r pandas filter

我正在学习 Hadly 的“R for Data Science”一书,并试图 复制 pandas 中的代码。

我遇到了这个问题:
我必须根据延迟时间创建一个新的排名列 航类并仅过滤它们的最小值和最大值。

R 代码:

library(nycflights13)
library(dplyr)

# remove nans
not_cancelled = flights %>% 
    filter( !is.na(dep_delay), !is.na(arr_delay))

# create new column of rank based on dep_time for each day.
df = not_cancelled %>%  
    group_by(year,month,day) %>%  
    mutate(r = min_rank(desc(dep_time))) %>%  
    filter(r %in% range(r)) %>%  # filter only first and last value
    select(year,month,day,dep_delay,arr_delay,r)

dim(df)
head(df,10)

这给出:

m=month d =day dl = dep_delay ad = arr_delay r =r
    year    m   d   dl  ad  r
    2013    1   1    2  11  831
    2013    1   1   -3  -12 1
    2013    1   2   43  36  928
    2013    1   2   -5  -24 1
    2013    1   3   33  22  900
    2013    1   3   -10 -11 1
    2013    1   4   26  23  908
    2013    1   4   -1  -8  1 
    2013    1   4   -1  -9  1 # Behold! january 4 has 3 rows!!
    2013    1   5   15  18  717

我正试图在 Pandas 中复制这个:

df = pd.read_csv('https://github.com/bhishanpdl/Datasets/blob/master/nycflights13.csv?raw=true')
# print(df.shape)
# print(df.iloc[:5,:5])

not_cancelled = df.dropna(subset=['dep_delay','arr_delay'])

df['r'] = not_cancelled.groupby(['year','month','day'])['dep_time']\
    .rank('min',ascending=False)

g = df.groupby(['year','month','day'])['r']
g = g.agg([min,max]).reset_index()

f = g.head()
print(f)

Python 输出:

(336776, 19)
   year  month  day  min    max
0  2013      1    1  1.0  831.0
1  2013      1    2  1.0  928.0
2  2013      1    3  1.0  900.0
3  2013      1    4  1.0  908.0
4  2013      1    5  1.0  717.0

这不太对。如何做正确的事?

感谢您的帮助。向 Pandas 致敬!

最佳答案

这是正确的输出,你只需要 reshape 你的输出

方法一堆栈

g = df.groupby(['year','month','day'])['r']
g = g.agg([min,max]).stack()
g=g.reset_index(level=[0,1,2])

方法二 melt

g=df.groupby(['year','month','day'])['r'].agg([min,max])
g.reset_index().melt(['year','month','day'])    

更新

g = df.groupby(['year','month','day'])['r']
g_max = g.transform('max')
g_min = g.transform('min')
yourdf=df.loc[(df.r==g_max)|(df.r==g_min),['year','month','day','r']]

关于python - 在 pandas groupby 之后只过滤少数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55786478/

相关文章:

java - 在 Android 应用程序中使用 Java 中的 R

python - 如何在 Pandas Dataframe 中合并多个具有相似名称的列而不丢失数据

python - 根据其他数据帧中的数据填充新数据帧

python - 并非所有组都在 Telethon 中可见

python --> pyinstaller - .exe 文件将返回 "test returned -1"

python - 假设策略 : for each "bucket", 从桶中取一个值

python - 数据透视表中计算列的聚合未显示正确

python - 在驱动器的特定文件夹中创建谷歌电子表格|谷歌驱动器 API

r - 多个 selectInput 值会产生意外的 dplyr (postgres) 行为

javascript - Shiny :insertUI 之前使用 removeUI 删除了一个 id