大熊猫:对分组数据框中的行进行排序和删除

时间:2018-09-28 18:38:46

标签: python pandas pandas-groupby

我有一个数据框:

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:“平均值”

所以我看了我的专栏文章

groupeddf.columns

给出:

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

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

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

1 个答案:

答案 0 :(得分:1)

您可以使用tuple键来索引您的DataFrame的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