pandas入门3

通过以下题目进行练习:
现在有2015道2017年40万条911的紧急电话的数据,请统计出这些数据中不同类型的紧急情况的次数,如果我们还想统计出不同月份不同类型紧急电话的次数的变化情况,应该怎么做.
导入模块

import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

首先概览数据信息,找到我们需要的信息在哪,经过观察得知数据类型在title列中

df = pd.read_csv('D:/data/911.csv')
print(df.head(5)["title"])
print(df.info())

在这里插入图片描述

接下来对取title列,对其进行切片并且剔除所有重复类型

temp_list = df["title"].str.split(":").tolist()
cate_list = list(set([i[0] for i in temp_list]))

第一种方法:

# 构造全为0的数组
dn = pd.DataFrame(np.zeros((df.shape[0], len(cate_list))), columns=cate_list)
# print(dn)

# 只需要循环三次,如果对dn遍历需要40W+次,会很慢
for cate in cate_list:
    # dn[df["title"].str.contains(cate)][cate] = 1
    dn.loc[df["title"].str.contains(cate), cate] = 1
print(dn.sum(axis=0))

在这里插入图片描述

第二种方法:
在原有数据中添加一列cate,再采用分组,聚合求和的方式求各类总数

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)))
# print(df.info())
print(df.groupby(by="cate").count()["title"])

第三种方法:

temp_list = df["title"].str.split(":").tolist()
# 该方法会遍历40W+次,效率极低
for i in range(df.shape[0]):
    dn.loc[i, temp_list[i][0]] = 1
print(dn.sum(axis=0))

在对以上三种方法计时后得到:
第一种方法: 3.36s
第二种方法: 2.69s
第三种方法: 55.69s

记下来计算每个月发生的次数

df = pd.read_csv('D:/data/911.csv')
# n为切割次数
month = df["timeStamp"].str.rsplit("-", n=1).tolist()
# print(month)
month_list = [i[0] for i in month]
df["month"] = pd.DataFrame(np.array(month_list).reshape((df.shape[0], 1)))
# print(df.info())
print(df.groupby(by="month").count()["title"])

在这里插入图片描述

实际上pandas中有时间序列,可以更好的处理这种时间戳.

df = pd.read_csv('D:/data/911.csv')
# print(df.info())
# 将字符串转化为时间序列
df["timeStamp"] = pd.to_datetime(df["timeStamp"])
# 设置timeStamp为索引,不删除原timeStamp列
df.set_index("timeStamp", inplace=True)
# 对时间序列以月份进行重采样,结果形式类似于groupby
month_count = df.resample("M").count()["title"]

plt.figure(figsize=(20, 8), dpi=80)
_x = month_count.index
_y = month_count.values
# _x中时间序列有时分秒,将其重新格式化
_x2 = [i.strftime('%Y-%m-%d') for i in _x]
plt.plot(range(len(_x2)), _y)
plt.xticks(range(len(_x2)), _x2, rotation=45)
plt.savefig('./2.png')
plt.show()

在这里插入图片描述

接下来统计不同月份不同类型事件的变化情况.

df = pd.read_csv('D:/data/911.csv')

# 添加事件列
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)))

# 将timeStamp转化为时间序列并设置为索引
df["timeStamp"] = pd.to_datetime(df["timeStamp"])
df.set_index("timeStamp", inplace=True)

# 对事件类型分组,得到的groups格式为 [[group_name, group_data],[]...]
groups = df.groupby(by="cate")

plt.figure(figsize=(20, 8), dpi=80)

#
for group_name, group_data in groups:
    cate_count = group_data.resample("M").count()["title"]
    x = cate_count.index
    y = cate_count.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.savefig('./3.png')
plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值