Pandas/Numpy分组聚合和过滤(包括整数均值)

3
我对pandas / Numpy不熟悉,正在尝试了解其工作原理。
我正在使用以下数据集,用于前1000部IMDb电影评分: https://github.com/justmarkham/pandas-videos/blob/master/data/imdb_1000.csv 我想按类型分组,按电影数量(> 100)过滤,然后显示最小值/最大值/平均值(作为整数)/中位数(作为整数)/计数。
到目前为止,我有:
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

But I want:

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部电影的所有类型的平均持续时间? - undefined
编辑以显示 :) - undefined
2个回答

3

是的,您可以直接链接过滤器和groupby

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

谢谢!我没意识到我可以链式使用groupby。顺便问一下,使用字符串('min')而不是函数名(min)作为聚合的优势是什么? - undefined
2
据我所知,如果你使用min,你会运行Python函数min,它比其numpy等效函数慢(字符串将映射到该函数)。 - undefined

3

由于数据集相对较小,计算后进行过滤不会有太大影响。

"Original Answer"的中文翻译为"最初的回答"

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函数结合使用是在不创建中间变量的情况下过滤列的更简单方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接