python对导入文件数据进行(查看、分析、解题思路、流程)做详细分析(适用于python初学者)

本文代码和文件下载

链接: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()理解
  • 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“),指的是筛选出dftitle标签下的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

Guess you like

Origin blog.csdn.net/weixin_54546190/article/details/119298967