繁体   English   中英

熊猫:从分组数据框中排序和删除行

[英]pandas: sorting and dropping rows from a grouped dataframe

我有一个数据框:

import pandas as pd
df = pd.read_csv('test.csv')

   brand  rating
0      a      81
1      a      83
2      a      60
3      a      45
4      b      73
5      b      55
6      b      90
7      c      60
8      d      70
9      e      75
10     e      80
11     e      85

到目前为止,我已经弄清楚如何按品牌对我的数据框进行分组并计算每个品牌类别的平均值和数量:

groupeddf = df.groupby('brand', as_index=False).agg(['count', 'mean'])

它产生:

      rating           
       count       mean
brand                  
a          4  67.250000
b          3  72.666667
c          1  60.000000
d          1  70.000000
e          3  80.000000

现在,我想按平均值对这些结果进行排序,并删除少于三个的任何品牌(因此在这种情况下,删除 C 和 D 的行)。

我试图按“平均”排序:

groupeddf.sort_values('mean')

但是,我收到一个 KeyError:'mean'

所以我查看了我的专栏:

groupeddf.columns

这使:

MultiIndex(levels=[['rating'], ['count', 'mean']],
       labels=[[0, 0], [0, 1]])

而且,现在我不确定该怎么做。 我想做的就是:

  • 按品牌对我的原始数据框进行分组
  • 计算每个品牌的平均值和数量
  • 按均值降序排序
  • 消除计数 < 3 的任何数据

您可以使用tuple键来索引MultiIndex的 MultiIndex:

s = df.groupby('brand').agg(['count', 'mean'])

s[s[('rating', 'count')] >= 3].sort_values(by=('rating', 'mean'))

      rating
       count       mean
brand
a          4  67.250000
b          3  72.666667
e          3  80.000000

如果你想避免创建MultiIndex摆在首位, agg上你的Series ,而不是整个DataFrame

s = df.groupby('brand').rating.agg(['count', 'mean'])

       count       mean
brand
a          4  67.250000
b          3  72.666667
c          1  60.000000
d          1  70.000000
e          3  80.000000

现在索引更简单:

s[s['count'] >= 3].sort_values(by='mean')

       count       mean
brand
a          4  67.250000
b          3  72.666667
e          3  80.000000

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM