簡體   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