2015-04-17 65 views
2

TL; DR如何編寫長熊貓聚合?

怎麼寫,涉及像groupby()unstack()apply()以及許多操作長聚合?

說你有n_events = 10不同事件DataFrame()n_sales = 1000售票,像

​​

,你想在多少事件至少n = [50, 100]門票在出售積晚上: # of events over time where at least x/y tickets were sold

然後我會去做

accumulation_of_sales = sales.groupby(['Time', 'Event']).size().unstack().fillna(0).cumsum() 
events_with_n_sales = accumulation_of_sales.apply(lambda x: x.value_counts(), axis=1).fillna(0) 
events_with_geq_n_sales = events_with_n_sales[events_with_n_sales.columns[::-1]].cumsum(axis=1) 

events_with_geq_n_sales[n].plot() 

這似乎很難讀,我和線條原則太長(見PEP)。所以,

  • 這個特定的和類似的操作如何做得最好?
  • 是否有一些教程/風格指南/ ...爲初學者?也許不是特別是熊貓,但類似的語言?
+0

如果你想知道爲什麼我會想這樣做:我需要爲已讀出的隨機模型比較與整數實驗數據。所以這是隨着時間的推移可能產生的堆積直方圖。 – qiv

回答

4

一寫多大熊貓查詢的方法是使用:

accumulation_of_sales = sales.groupby(['Time', 'Event'])\ 
          .size()\ 
          .unstack()\ 
          .fillna(0)\ 
          .cumsum() 

我有時喜歡在括號來包裝這些代替。

但是,如果您在這裏經常做幾件事情,那麼有一種更簡單的方法。例如,當你看到 「GROUPBY +拆散」 你應該想到 「pivot_table」:(即相當於,更高效,更可讀)

sales.pivot_table(columns='Event', index='Time', aggfunc=len, fill_value=0).cumsum() 

2

除了@安迪的方法。我更喜歡使用括號()編寫多語句

accumulation_of_sales = (sales.groupby(['Time', 'Event']) 
         .size() 
         .unstack() 
         .fillna(0) 
         .cumsum())