【问题标题】:Pandas/Numpy Groupby + Aggregate (inc integer mean) + FilterPandas/Numpy Groupby + 聚合(包括整数平均值)+ 过滤器
【发布时间】:2019-07-21 22:23:54
【问题描述】:

我是 pandas/Numpy 的新手,我正在四处看看一切是如何运作的。

我将这个数据集用于 IMDb 电影评分前 1000 名: https://github.com/justmarkham/pandas-videos/blob/master/data/imdb_1000.csv

我正在尝试按类型分组,按电影数量 (> 100) 进行过滤,然后显示 min/max/mean(作为整数)/median(作为 int)/count。

到目前为止我有:

df.groupby("genre")['duration'].aggregate(['min', max, np.mean, np.median, 'count']).sort_values('median', ascending=False)

这显示了所有类型和持续时间的统计信息,但平均值和中位数是浮动的,它包括那些计数较低的。

我想以某种方式将它与这样的东西结合起来:

df.groupby("genre")['duration'].filter(lambda x: x.count() > 100)

df.groupby("genre")['duration'].mean().astype(int)

这可能吗?

接下来我想把它全部画出来,但那是另一天...

谢谢!

编辑 1

为了澄清,目前我得到:

genre       min max mean        median  count
Western     85  175 136.666667  135.0   9
Adventure   89  224 134.840000  127.0   75
Biography   85  202 131.844156  127.0   77
Action      80  205 126.485294  125.0   136
Drama       64  242 126.539568  123.0   278
Crime       67  229 122.298387  118.0   124
Thriller    107 120 114.200000  116.0   5
Mystery     69  160 115.625000  115.0   16
Sci-Fi      91  132 109.000000  113.0   5
Fantasy     112 112 112.000000  112.0   1
Family      100 115 107.500000  107.5   2
Comedy      68  187 107.602564  104.0   156
Horror      70  146 102.517241  104.0   29
Animation   75  134 96.596774   94.5    62
Film-Noir   88  111 97.333333   93.0    3
History     66  66  66.000000   66.0    1

但我想要:

genre       min max mean median count
Action      80  205 126  125    136
Drama       64  242 127  123    278
Crime       67  229 122  118    124
Comedy      68  187 108  104    156

【问题讨论】:

  • 所以你想要所有类型超过 100 部电影的平均持续时间?
  • 编辑显示:)

标签: python pandas numpy pandas-groupby


【解决方案1】:

是的,您可以简单地链接过滤器和groupbys:

df.groupby('genre').filter(
    lambda x: len(x) > 100
).groupby('genre')['duration'].aggregate(
    ['min','max','mean','median','count']
).sort_values('median', ascending=False)

结果如下:

>>> df.groupby('genre').filter(lambda x: len(x) > 100).groupby('genre')['duration'].aggregate(['min','max','mean','median','count']).sort_values('median', ascending=False)
        min  max        mean  median  count
genre                                      
Action   80  205  126.485294     125    136
Drama    64  242  126.539568     123    278
Crime    67  229  122.298387     118    124
Comedy   68  187  107.602564     104    156

您也可以将其转换为整数:

>>> df.groupby('genre').filter(lambda x: len(x) > 100).groupby('genre')['duration'].aggregate(['min','max','mean','median','count']).sort_values('median', ascending=False).astype(int)
        min  max  mean  median  count
genre                                
Action   80  205   126     125    136
Drama    64  242   126     123    278
Crime    67  229   122     118    124
Comedy   68  187   107     104    156

【讨论】:

  • 谢谢!我没有意识到我可以链接groupbys。顺便说一句,聚合有字符串('min')而不是函数名(min)有优势吗?
  • @Jamesdeluk:据我所知,如果你使用min,你会运行 Python 函数min,它比它的 numpy 等效函数(字符串将映射到该函数)要慢。
【解决方案2】:

由于数据集相对较小,运行计算并在此之后进行过滤并没有什么坏处。

file = 'https://raw.githubusercontent.com/justmarkham/pandas-videos/master/data/imdb_1000.csv'

data = (pd.read_csv(file)
          .groupby("genre")['duration']
          .agg(['min', 'max', 'mean', 'median', 'count'])
          .loc[lambda x:x['count']>100]
          .sort_values('median', ascending=False))

loc 带有 lambda 函数是一种更简单的方法来过滤列,而无需创建中间变量。

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 2022-01-21
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多