2017-04-26 35 views
1

我從一個很大的數據框開始。我削減並重新排列了一些列。最後一個(相當大的)數據幀我救的頭是這樣的:groupby語句是否導致數據框崩潰到系列?

# bsa_mod = 'best supporting actress modified' dataframe 
[1] bsa_mod = bsa_mod[['Year', 'Name', 'Winner']] 
[2] bsa_mod.head() 

    Year Name    Winner 
431 1936 Beulah Bondi  0.0 
432 1936 Alice Brady   0.0 
433 1936 Bonita Granville 0.0 
434 1936 Maria Ouspenskaya 0.0 
435 1936 Gale Sondergaard 1.0 

我需要把所有的名字一起算上虛擬變量旁邊的每個。例如,Agnes Morehead出現在Name列中4次,每次在她名字旁邊都有一個0或1,所以最後的總結表應該說'Agnes Morehead 4'。我得到了下列要求:

# aggregate nominations by actress 
bsa_mod_count = bsa_mod.groupby('Name').Winner.count() 
Name 
Abigail Breslin 1 
Adriana Barraza 1 
Agnes Moorehead 4 
Alfre Woodard  1 
Alice Brady  2 
Name: Winner, dtype: int64 

我跑這個.describe()來獲取摘要統計,發現計算的最大值爲6

我想找出誰該神祕人是通過運行這樣:

most_nominations = bsa_mod_count[bsa_mod_count.Winner == 6] 

出乎我的意料,我得到一個屬性錯誤,指出「勝者」並不存在,這與我現在正在處理的數據類型是一系列並不再是一個數據幀。

在'groupby'之後數據框會退化爲一系列嗎?我並不指望我的索引被覆蓋,這在我運行.agg(['count'])時似乎也會發生。有沒有另外一種方法可以做到這一點,以保存我的數據框並呈現'6'可用?

回答

1
#if you want to retain the index and the dataframe format, try below: 
bsa_mod['Winner_Count'] = bsa_mod.apply(lambda x: bsa_mod.Name.value_counts()[x.Name],axis=1) 
print(bsa_mod) 

    Year    Name Winner Winner_Count 
431 1936  Beulah Bondi  0.0    1 
432 1936  Alice Brady  0.0    1 
433 1936 Bonita Granville  0.0    1 
434 1936 Maria Ouspenskaya  0.0    1 
435 1936 Gale Sondergaard  1.0    1 

#Then you can do something like: 
bsa_mod[bsa_mod.Winner_Count == 2] 
+0

這是一個非常性感的lambda函數。我一定會玩它。非常感激! – Ryan

+0

我想接受你的回答。如果你不介意我問,你的方式如何保留索引,而另一種方式卻不行?我該如何解讀[x.Name]? – Ryan

+1

因爲當您執行groupby時,您正在執行聚合操作,這可能會減少記錄數。例如,如果您有多個'Alice Brady',在groupby之後,'Alice Brady'將只有一條記錄。由於有多個索引,因此使用原始索引會很模糊。雖然在我的解決方案中,我根本沒有做羣組。 apply函數將僅查找當前行中的名稱計數。 – Allen

2

答案是否定,分組通過確保結構。

在你的例子中bsa_mod.groupby('Name').Winner.count()返回一個系列對象,而bsa_mod.groupby('Name').count()返回一個數據幀。

+0

提問並回答!希望那是我觀看的視頻。非常感謝! – Ryan