现在我们有2015到2017年25万条911的紧急电话的数据,请统计出出这些数据中不同类型的紧急情况的次数。
方法一:(分类后用布尔索引求和)
#现在我们有2015到2017年25万条911的紧急电话的数据,请统计出出这些数据中不同类型的紧急情况的次数
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
df=pd.read_csv("./911.csv")
###print(df.head(10))
###print(df.info())
##获取分类情况
##print(df["title"].str.split[":"])###Series类型
temp_list=df["title"].str.split(":").tolist()##获取某一行,例[EMS, BACK PAINS/INJURY]
cate_list=list(set(i[0] for i in temp_list))###获取某一行的第一个元素,set转成单个字符进行插入
print(cate_list)###得到三个类型['EMS', 'Fire', 'Traffic'],还得统计个数
###构造全为0的数组,行是df.shape[0],列是电话类型
zeros_df= pd.DataFrame(np.zeros((df.shape[0],len(cate_list))),columns=cate_list)
#赋值,#赋值,遍历cate_list只有3个数据,遍历temp_list数据太多,太慢
for cate in cate_list:
zeros_df[cate][df["title"].str.contains(cate)] = 1
print(zeros_df)
#如果df["title"].str.contains()包含cate
#df["title"].str.contains(cate)是布尔索引
# 计算总数
sum_ret = zeros_df.sum(axis=0)
思路:通过提取某一行的第一个元素来获取分类:赋值部分运用类型比较少cate来遍历,再运用布尔索引,TRUE被赋值为1
结果:
Fire EMS Traffic
0 0.0 1.0 0.0
1 0.0 1.0 0.0
2 1.0 0.0 0.0
3 0.0 1.0 0.0
4 0.0 1.0 0.0
... ... ... ...
249732 0.0 1.0 0.0
249733 0.0 1.0 0.0
249734 0.0 1.0 0.0
249735 1.0 0.0 0.0
249736 0.0 0.0 1.0
[249737 rows x 3 columns]
Fire 37432.0
EMS 124844.0
Traffic 87465.0
dtype: float64
注:
Series类型转换为列表是.tolist()
DataFrame是.to_list()
方法二:(增加cate一列再用groupby来按照分类求和)
#现在我们有2015到2017年25万条911的紧急电话的数据,请统计出出这些数据中不同类型的紧急情况的次数
import pandas as pd
from matplotlib import pyplot as plt
import numpy as np
df=pd.read_csv("./911.csv")
###print(df.head(10))
###print(df.info())
##获取分类情况
##print(df["title"].str.split[":"])###Series类型
temp_list=df["title"].str.split(":").tolist()##获取某一行,例[EMS, BACK PAINS/INJURY]
cate_list=list(set(i[0] for i in temp_list))###获取某一行的第一个元素
df["cate"]=pd.DataFrame(np.array(cate_list).reshape(df.shape(0),1))###往df添加一列,cate列
print(cate_list)###得到三个类型['EMS', 'Fire', 'Traffic'],还得统计个数
df.groupby(by="cate").count()["title"]###根据cate进行分类,再统计个数,再取一列
如果我们还想统计出不同月份不同类型紧急电话的次数的变化情况,应该怎么做呢?