文章目录
- 本文代码和文件下载
- (一)分析问题
- (二)导入文件
- (三)查看文件数据
- (四)提取相应的数据
- 4.1 解释上述代码以及思路
- 4.1.1 把title数据变成列表形式
- 4.1.2 提取出title数据的所有不同类型
- 4.1.3 构造一个全为0的数组
- 4.1.4 给zeros_df赋值
- 4.1.5 求和
本文代码和文件下载
链接:https://pan.baidu.com/s/1SYN5TLEaoV8QKLFILFFCIg 提取码:kthf
(一)分析问题
现在我们有2015到2017年25万条911的紧急电话的数据,请统计出这些数据中不同类型的紧急情况
的次数。
- 那首先我们要找到911.csv文件中紧急情况所对应名称和数据才能编写成功。
(二)导入文件
文件911下载链接:911.csv提取码:qtzb
# coding=utf-8
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
df = pd.read_csv("911.csv")
(三)查看文件数据
学会查看文件数据,寻找对应的数据。
df = pd.read_csv("911.csv")
print(df.head(10))
# df.head()此函数根据位置返回对象的前n行。这对于快速测试对象中的数据类型是否正确非常有用,并默认输出之后的五行,在head后面的括号里面直接写你想要输出的行数也行,比如2,10,100之类的。
print("$ $ "*50)
print(df.info)
# 函数用于获取 DataFrame 的简要摘要。在对数据进行探索性分析时,它非常方便。为了快速浏览数据集,我们使用dataframe.info()功能。
OUT:
lat lng desc zip title timeStamp twp addr e
0 40.297876 -75.581294 REINDEER CT & DEAD END; NEW HANOVER; Station ... 19525.0 EMS: BACK PAINS/INJURY 2015-12-10 17:10:52 NEW HANOVER REINDEER CT & DEAD END 1
1 40.258061 -75.264680 BRIAR PATH & WHITEMARSH LN; HATFIELD TOWNSHIP... 19446.0 EMS: DIABETIC EMERGENCY 2015-12-10 17:29:21 HATFIELD TOWNSHIP BRIAR PATH & WHITEMARSH LN 1
2 40.121182 -75.351975 HAWS AVE; NORRISTOWN; 2015-12-10 @ 14:39:21-St... 19401.0 Fire: GAS-ODOR/LEAK 2015-12-10 14:39:21 NORRISTOWN HAWS AVE 1
3 40.116153 -75.343513 AIRY ST & SWEDE ST; NORRISTOWN; Station 308A;... 19401.0 EMS: CARDIAC EMERGENCY 2015-12-10 16:47:36 NORRISTOWN AIRY ST & SWEDE ST 1
4 40.251492 -75.603350 CHERRYWOOD CT & DEAD END; LOWER POTTSGROVE; S... NaN EMS: DIZZINESS 2015-12-10 16:56:52 LOWER POTTSGROVE CHERRYWOOD CT & DEAD END 1
5 40.253473 -75.283245 CANNON AVE & W 9TH ST; LANSDALE; Station 345;... 19446.0 EMS: HEAD INJURY 2015-12-10 15:39:04 LANSDALE CANNON AVE & W 9TH ST 1
6 40.182111 -75.127795 LAUREL AVE & OAKDALE AVE; HORSHAM; Station 35... 19044.0 EMS: NAUSEA/VOMITING 2015-12-10 16:46:48 HORSHAM LAUREL AVE & OAKDALE AVE 1
7 40.217286 -75.405182 COLLEGEVILLE RD & LYWISKI RD; SKIPPACK; Stati... 19426.0 EMS: RESPIRATORY EMERGENCY 2015-12-10 16:17:05 SKIPPACK COLLEGEVILLE RD & LYWISKI RD 1
8 40.289027 -75.399590 MAIN ST & OLD SUMNEYTOWN PIKE; LOWER SALFORD;... 19438.0 EMS: SYNCOPAL EPISODE 2015-12-10 16:51:42 LOWER SALFORD MAIN ST & OLD SUMNEYTOWN PIKE 1
9 40.102398 -75.291458 BLUEROUTE & RAMP I476 NB TO CHEMICAL RD; PLYM... 19462.0 Traffic: VEHICLE ACCIDENT - 2015-12-10 17:35:41 PLYMOUTH BLUEROUTE & RAMP I476 NB TO CHEMICAL RD 1
$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $
<bound method DataFrame.info of lat lng desc zip title timeStamp twp addr e
0 40.297876 -75.581294 REINDEER CT & DEAD END; NEW HANOVER; Station ... 19525.0 EMS: BACK PAINS/INJURY 2015-12-10 17:10:52 NEW HANOVER REINDEER CT & DEAD END 1
1 40.258061 -75.264680 BRIAR PATH & WHITEMARSH LN; HATFIELD TOWNSHIP... 19446.0 EMS: DIABETIC EMERGENCY 2015-12-10 17:29:21 HATFIELD TOWNSHIP BRIAR PATH & WHITEMARSH LN 1
2 40.121182 -75.351975 HAWS AVE; NORRISTOWN; 2015-12-10 @ 14:39:21-St... 19401.0 Fire: GAS-ODOR/LEAK 2015-12-10 14:39:21 NORRISTOWN HAWS AVE 1
3 40.116153 -75.343513 AIRY ST & SWEDE ST; NORRISTOWN; Station 308A;... 19401.0 EMS: CARDIAC EMERGENCY 2015-12-10 16:47:36 NORRISTOWN AIRY ST & SWEDE ST 1
4 40.251492 -75.603350 CHERRYWOOD CT & DEAD END; LOWER POTTSGROVE; S... NaN EMS: DIZZINESS 2015-12-10 16:56:52 LOWER POTTSGROVE CHERRYWOOD CT & DEAD END 1
... ... ... ... ... ... ...
... ... ..
639893 40.087810 -75.304726 SCARLET DR & COLWELL LN; PLYMOUTH; 2020-05-26 ... 19428.0 Fire: GAS-ODOR/LEAK 2020-05-26 09:17:31 PLYMOUTH SCARLET DR & COLWELL LN 1
639894 40.058569 -75.126960 COVENTRY AVE & VALLEY RD; CHELTENHAM; Station... 19027.0 EMS: RESPIRATORY EMERGENCY 2020-05-26 09:30:06 CHELTENHAM COVENTRY AVE & VALLEY RD 1
639895 40.151622 -75.120972 EASTON RD & ELLIS RD; UPPER MORELAND; 2020-05-... 19090.0 Fire: FIRE ALARM 2020-05-26 09:35:44 UPPER MORELAND EASTON RD & ELLIS RD 1
639896 40.175388 -75.108397 HARDING AVE & WILLIAMS LN; HATBORO; Station 3... 19040.0 EMS: UNRESPONSIVE SUBJECT 2020-05-26 09:40:28 HATBORO HARDING AVE & WILLIAMS LN 1
639897 40.079811 -75.293981 E 11TH AVE; CONSHOHOCKEN; 2020-05-26 @ 09:36:3... 19428.0 Fire: FIRE INVESTIGATION 2020-05-26 09:36:34 CONSHOHOCKEN E 11TH AVE 1
从这些输出的数据中和标题中找到不同类型的紧急情况
,通过仔细查看我们可发现是column = title这一列:因为EMS:理解为急救;Fire:火警或火灾,或者从EMS: BACK PAINS/INJURY(背部受伤)、Fire: FIRE ALARM(火警)可以看出这些都是表示紧急情况
。
(四)提取相应的数据
既然上面我们找到了我们所要找的紧急情况数据title
,现在我们要把title
的所有数据提取出来
# 获取分类
temp_list = df["title"].str.split(":").tolist()
cate_list = list(set([i[0] for i in temp_list]))
print(cate_list) # 输出结果为['Fire', 'Traffic', 'EMS']
OUT:
['EMS', 'Fire', 'Traffic']
得结论:说明紧急情况就总共就分三种,火灾、交通事故、急救
.
4.1 解释上述代码以及思路
4.1.1 把title数据变成列表形式
# 把title数据变成列表形式
temp_list = df["title"].str.split(":").tolist()
展示输出的一小部分数据看一下生成什么样的效果OUT
[['Fire', ' FIRE INVESTIGATION'], ['EMS', ' SUBJECT IN PAIN'], ['EMS', ' FALL VICTIM'], ['EMS', ' RESPIRATORY EMERGENCY'], ['Fire', ' FIRE INVESTIGATION'], ['EMS', ' UNCONSCIOUS SUBJECT'], ['Fire', ' GAS-ODOR/LEAK'], ['EMS', ' RESPIRATORY EMERGENCY'], ['Fire', ' FIRE ALARM'], ['EMS', ' UNRESPONSIVE SUBJECT'], ['Fire', ' FIRE INVESTIGATION']]
1.首先:我们大概看一下title
这一列数据是什么样的,如下:
title
EMS: BACK PAINS/INJURY
EMS: DIABETIC EMERGENCY
Fire: GAS-ODOR/LEAK
EMS: CARDIAC EMERGENCY
2.上面数据都是字符串形式(str
);
3.每种类型的行分类标志都用’ : '分开的(split(":")
);
4.显而易见title数据是属于Series
类型,所以把title数据变成列表[ [],[]···,[] ]形式,要使用tolist(),如果是DataFrame类型数据,我们要使用to_list();
4.1.2 提取出title数据的所有不同类型
首先我写了一个简化的代码(很好理解,一定要看懂
),帮助理解下面的类容,不然直接阅读下面类容可能会理解的不是很清楚。
temp_list = [[2,5,6],[2,6,8],[3,6,8]]
for i in temp_list:
print(i)
c = set([i[0] for i in temp_list])
print("# # #"*2)
print(c)
cate_list = list(c)
print("# # #"*2)
print(cate_list)
OUT
[2, 5, 6]
[2, 6, 8]
[3, 6, 8]
# # ## # #
{2, 3}
# # ## # #
[2, 3]
# 提取出title数据的所有不同类型
cate_list = list(set([i[0] for i in temp_list]))
1.从上面的生成的列表[['Fire', ' FIRE INVESTIGATION'], ['EMS', ' SUBJECT IN PAIN'], ['EMS', ' FALL VICTIM'], ['EMS', ' RESPIRATORY EMERGENCY']
可知,每个列表中的数据类型都在每一个小列表的第一个元素,那我们提取数据类型是不是只要提取每一个列表的第一个元素。
2.[i[0] for i in temp_list]
指的是提取tempt_list中每一个列表的第一个元素,并生成一个新的集合
这种{}
表示集合,可以参考下面代码理解。
li = []
for i in range(1, 11):
li.append(i*2)
print(li)
OUT
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
3.**set()
**函数创建一个无序不重复元素集,删除重复数据,可以参考下面代码理解。
x = set('runoob')
print(x)
OUT
{'r', 'u', 'n', 'o', 'b'}
4.**list()
**就是指生成一个列表。
4.1.3 构造一个全为0的数组
# 构造全为0的数组
zeros_df = pd.DataFrame(np.zeros((df.shape[0],len(cate_list))),columns=cate_list)
OUT:
Fire EMS Traffic
0 0.0 0.0 0.0
1 0.0 0.0 0.0
2 0.0 0.0 0.0
3 0.0 0.0 0.0
4 0.0 0.0 0.0
... ... ... ...
639893 0.0 0.0 0.0
639894 0.0 0.0 0.0
639895 0.0 0.0 0.0
639896 0.0 0.0 0.0
639897 0.0 0.0 0.0
理解 np.zeros((df.shape[0],len(cate_list))),columns=cate_list
- df.shape[0]:指df这个DataFrame类型的行数,所以df.shape[0] = 639897。
- len(cate_list):指cate_list的长度。由上面可知cate_list = [‘EMS’, ‘Fire’, ‘Traffic’],所以 len(cate_list) = 3.
- 所以np.zeros((df.shape[0],len(cate_list))等于np.zeros(639897,3),表示生成一个639897行3列的数组。
- columns=cate_list :指生成DataFrame类型数组的列标签分别为EMS、Fire、Traffic。
-
pd.DataFrame(np.zeros((df.shape[0],len(cate_list))),columns=cate_list)
等于pd.DataFrame(np.zeros((639897,3)),columns= ['EMS', 'Fire', 'Traffic'])
。
4.1.4 给zeros_df赋值
for cate in cate_list:
zeros_df[cate][df["title"].str.contains(cate)] = 1
# 只打印一行看看
#print(zeros_df)
#break
print(zeros_df)
OUT:
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
... ... ... ...
639893 1.0 0.0 0.0
639894 0.0 1.0 0.0
639895 1.0 0.0 0.0
639896 0.0 1.0 0.0
639897 1.0 0.0 0.0
分析在第一次for循环如下:
- cate_list = [‘EMS’, ‘Fire’, ‘Traffic’],所以第一次for循环的cate = EMS。
- contains(case)在第一次for循环中等于contains(“EMS”)筛选
df
中存在EMS
字符串。 -
df["title"].str.contains(cate)
在第一次for循环等于df["title"].str.contains(”EMS“)
,指的是筛选出df
中title标签
下的EMS
字符串。 - zeros_df[cate][df[“title”].str.contains(cate)] = 1:
在第一次for循环下等于:
zeros_df["EMS"][df["title"].str.contains("EMS")] = 1
# 表示如果筛选出df中title标签下含有`EMS`字符串,则zeros_df中标签EMS位置的0元素变赋值为1。
#指df中title标签下每一行是否有`EMS`字符串,如果有(假设第2行含有),则zeros_df中第2行EMS列所对应的0元素赋值为1。
4.1.5 求和
# 对zeros_df中每一列求和
sum_ret = zeros_df.sum(axis=0)
print(sum_ret)
OUT:
Fire 96177.0
Traffic 223395.0
EMS 320333.0
dtype: float64