7. 用带有DatetimeIndex的匿名函数做分组

  1. # 读取crime数据集,行索引设为REPORTED_DATE,并排序
  2. In[124]: crime_sort = pd.read_hdf('data/crime.h5', 'crime') \
  3. .set_index('REPORTED_DATE') \
  4. .sort_index()
  5. # 输出DatetimeIndex的可用属性和方法
  6. In[125]: common_attrs = set(dir(crime_sort.index)) & set(dir(pd.Timestamp))
  7. print([attr for attr in common_attrs if attr[0] != '_'])
  8. ['nanosecond', 'month', 'daysinmonth', 'year', 'is_quarter_start', 'offset', 'tz_localize', 'second', 'is_leap_year', 'resolution', 'freqstr', 'week', 'weekday', 'is_month_start', 'normalize', 'to_julian_date', 'to_period', 'freq', 'tzinfo', 'weekday_name', 'microsecond', 'days_in_month', 'date', 'is_quarter_end', 'tz', 'to_datetime', 'tz_convert', 'weekofyear', 'time', 'hour', 'min', 'max', 'floor', 'is_year_start', 'ceil', 'dayofweek', 'day', 'quarter', 'dayofyear', 'round', 'strftime', 'is_month_end', 'minute', 'is_year_end', 'to_pydatetime']
  9. # 用index找到星期名
  10. In[126]: crime_sort.index.weekday_name.value_counts()
  11. Out[126]: Monday 70024
  12. Friday 69621
  13. Wednesday 69538
  14. Thursday 69287
  15. Tuesday 68394
  16. Saturday 58834
  17. Sunday 55213
  18. Name: REPORTED_DATE, dtype: int64
  1. # groupby可以接收函数作为参数。
  2. # 用函数将行索引变为周几,然后按照犯罪和交通事故统计
  3. In[127]: crime_sort.groupby(lambda x: x.weekday_name)['IS_CRIME', 'IS_TRAFFIC'].sum()
  4. Out[127]:

7. 用带有DatetimeIndex的匿名函数做分组 - 图1

  1. # 可以用函数列表,用天的小时时间和年做分组,然后对表做重构型
  2. In[128]: funcs = [lambda x: x.round('2h').hour, lambda x: x.year]
  3. cr_group = crime_sort.groupby(funcs)['IS_CRIME', 'IS_TRAFFIC'].sum()
  4. cr_final = cr_group.unstack()
  5. cr_final.style.highlight_max(color='lightgrey')
  6. Out[128]:

7. 用带有DatetimeIndex的匿名函数做分组 - 图2

更多

  1. # xs方法可以从任意索引层选出一个唯一值
  2. In[129]: cr_final.xs('IS_TRAFFIC', axis='columns', level=0).head()
  3. Out[129]:

7. 用带有DatetimeIndex的匿名函数做分组 - 图3

  1. # 用xs只从2016年选择数据,层级是1
  2. In[130]: cr_final.xs(2016, axis='columns', level=1).head()
  3. Out[130]:

7. 用带有DatetimeIndex的匿名函数做分组 - 图4