→@TOC
统计911报警电话原因的分类
第一种方式:构建全为0的Dataframe
import pandas as pd import numpy as np from matplotlib import pyplot as plt file_path = "./911.csv" df = pd.read_csv(file_path) #获取分类 temp_list = df["title"].str.split(":").tolist() cate_list = list(set([i[0] for i in temp_list])) print(cate_list) #g构造全为0的数据 zeros_df = pd.DataFrame(np.zeros((df.shape[0],len(cate_list))),columns=cate_list) #给全0数组赋值,对zeros_df的三列进行遍历处理,相较于对整个temp_list的25万行进行遍历要快的多 for cate in cate_list: zeros_df[cate][df["title"].str.contains(cate)] = 1 #统计 sum_res = zeros_df.sum(axis=0) print(sum_res)
输出:
['Traffic', 'Fire', 'EMS'] Traffic 87465.0 Fire 37432.0 EMS 124844.0 dtype: float64
第二种方式:通过构建新的一列
import pandas as pd import numpy as np from matplotlib import pyplot as plt file_path = "./911.csv" df = pd.read_csv(file_path) # 首先将文件中的相关数据进行提取,然后形成一个新的列表cate_list temp_list = df['title'].str.split(":").tolist() cate_list = [i[0] for i in temp_list] # 通过将cate_list作为新的一列添加进文件中 df['cate'] = pd.DataFrame(np.array(cate_list).reshape((df.shape[0], 1))) # 再通过groupby方法将cate列分类,然后统计每组的个数 print(df.groupby(by='cate').count()['title'])
输出:
cate EMS 124840 Fire 37432 Traffic 87465 Name: title, dtype: int64
设置时间序列:
pd.data_range(start=None,end=None,periods=None,freq=‘D’)
Parameters ---------- start : str or datetime-like, optional Left bound for generating dates. end : str or datetime-like, optional Right bound for generating dates. periods : int, optional Number of periods to generate. freq : str or DateOffset, default 'D' Frequency strings can have multiples, e.g. '5H'. See :ref:`here <timeseries.offset_aliases>` for a list of frequency aliases.
关于freq的参数的更多表示方法:
D→每日
B→每工作日
H→每小时
S→每秒
L/ms→每毫秒
U→每微秒
M→每月最后一个日历日
BM→每月最后一个工作日
MS→每月第一个日历日
BMS→每月第一个工作日
pandas重采样:
指的是将时间序列从一个频率转化为另一个频率进行处理的过程,将高频率数据转化为低频率数据为降采样,低频率转化为高频率为升采样,resample()
应用:911数据中不同月份不同类型的电话的次数的变化情况
import pandas as pd import numpy as np from matplotlib import pyplot as plt # 911数据中不同月份不同类型的电话的次数的变化情况 # 把时间字符串转为时间类型并设置为索引 file_path = "./911.csv" df = pd.read_csv(file_path) df['timeStamp'] = pd.to_datetime(df['timeStamp']) # 添加列,表示分类 temp_list = df['title'].str.split(':').tolist() cate_list = [i[0] for i in temp_list] df['cate'] = pd.DataFrame(np.array(cate_list).reshape((df.shape[0], 1))) df.set_index('timeStamp', inplace=True) print(df.head(5)) plt.figure(figsize=(16, 9), dpi=144) for group_name, group_data in df.groupby(by='cate'): # 对不同的分类进行绘图 count_by_month = group_data.resample('M').count()['title'] _x = count_by_month.index _y = count_by_month.values _x = [i.strftime('%Y%m%d') for i in _x] plt.plot(range(len(_x)), _y, label=group_name) plt.xticks(range(len(_x)), _x, rotation=45) plt.legend(loc='best') plt.show()