2016-04-02 138 views
4

我有一個包含許多列的熊貓數據框,其中兩個是「電影標題」和「年齡」,我想查找平均年齡最低的前5個電影評價他們的人,但只包括具有至少100個評級的電影(因此至少出現在100行中)。在熊貓數據框中查找重複值和排序的計數

例如:

movie title  age 

Title 1   10 
Title 2   12 
Title 2   12 
Title 3   13 
Title 3   13 
Title 3   13 

應該改爲:

movie title  # of ratings  avg age 

Title 1   1     10 
Title 2   2     12 
Title 3   3     13 

它可以在相同或一個新的數據幀。謝謝你的幫助!

回答

3

的過濾器被設置爲True如果影片數超過一百每部電影創建一個標誌否則爲假。

n = 100 
filter = (df.groupby(['movie title'])['age'] 
      .transform(lambda group: group.count()) >= n) 

鑑於您的樣本數據的體積小,我將n爲2,創造我的過濾器。

現在我只是對超過n的電影進行篩選,計算每組的平均年齡,然後取最小的五個(即最低年齡)。

>>> df[filter.values].groupby('movie title').age.mean().nsmallest(5) 
movie title 
Title 2 12 
Title 3 13 
Name: age, dtype: int64 
+0

不能直接在groupby之後使用'filter'方法嗎? –

+0

當我運行它時,這看起來不會過濾掉評分低於100的電影嗎? – user2453297

+0

它適用於數據幀只有列電影標題和年齡。請參閱上面的修改以進行修復 – Alexander

4

說你做

agg = df.age.groupby([df['movie title']]).agg({'ave_age': 'mean', 'size': 'size'}) 

你會得到與列ave_agesize一個數據幀。

agg[agg['size'] > 100] 

會給你只有那些有超過100個用戶。從那裏,排序agg.ave_age,並採取前5名應該是這個樣子:

agg[agg['size'] > 100].sort_values(by='ave_age', ascending=True).head(5) 
+0

看看groupby。我相信'df.title'會拋出一個錯誤,並且不需要它。此外,'size'是一個dataframe屬性,所以你可能想要使用一個不同的變量名稱。 'ascending = True'是默認參數值,所以不是必需的,但它也不會因爲明確而受到傷害。 – Alexander

+0

謝謝,@Alexander你是對的 - 糾正。我相信'pd.read_clipboard()'在這個特殊的例子中做了一些奇怪的事情。因此,我做了一些修改,顯然有一個錯誤。 –

+0

我相信你想'agg = df.groupby('movie title')。age.agg(...)' – Alexander