2015-04-17 73 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())