数据分析——火车信息

任务目标

任务

1、整理火车发车信息数据,结果的表格形式为:

2、并输出最终的发车信息表

难点

1、多文件

        一个文件夹,多个月的发车信息,一个excel,放一天的发车情况

2、数据表的格式特殊

        如何分析表是一个难点

数据形式

图像呈现

文字描述

1、一张表含多辆车次信息

2、一辆车次信息分为标题(日期、车次、定员、客座率)和表格信息部分

3、表格信息部分分为x,y轴看

        横着是发车站点、发车时间、下车人数

        竖着是目标站点、到达时间、上车人数

4、图标呈现下三角趋势,因为过站无上车人数

注意:

        因为横着是上车站点,终点站没有人上车,所以横着的车次不包含终点站,是所有车次-1

        竖着的车次包含终点站——即所有车次信息

分析步骤

1、导入数据

存在问题

与原数据不同,原数据中的表头在该表的第一列中,每个属性对应的行为空值

处理方法

处理结果

结果分析

1、38列

        因为原excel表中,有车次信息到第38列,导入数据会保持表格格式完整性,所以取最大列数

        不到38的列数均为空值,需要处理

2、表格信息被存放在第一行中,还需处理

3、目标需求信息只到29列的下车人数,所以需要把有效信息抠出来

语法扩展(别人的资料)

python中pandas包使用的一个header参数_header=none-CSDN博客

2、数据处理

        2.1获取有效信息(扣表)

                2.1.1思路分析
                        1、判断车次

                              整张表包含很多车次

                              要知道哪一辆车是第几行到第几行,需要拆分

                            (即怎么判断,eg:0-33为车1,34-45为车2,······)

                         2、处理表头

                             导入的表中有很多表头,需要处理 ,把所有车次的表头抽取出来,找共同点

                             都有客座率

                        2.1.2解决方案
                                1、找表头

                                      1.1data[0] 

                                         因为数据表行列均有属性,表头均在第0列,所以先判断data[0]是第0行还是第0列

                                        1.2找到含有“客座率”的行数

语法扩展
apply()、lambda

loc()

Pandas读取某列、某行数据——loc、iloc用法总结_pandas读取某一行的数据-CSDN博客

                                1.3生成由表头信息组成的表

                                1.4批量分割+展开表

按照空格分割后得到一个表格

split()

Python知识精解:str split()方法 - 知乎 (zhihu.com)

expand参数

pandas的分列操作str.split()_pandas数据分列-CSDN博客

                                  2、生成除表头外的信息表

data=data[~ind]

                                 3、生成一趟车的数据

1、根据上车站点和上车人数所在的行(用遍历匹配)

确定每一趟列车所包含的行数,再扣其中的数据

2、找第一趟车的信息

3、重置行索引

因为之前删数据把行索引删了,出现了数据缺失,需要重置行索引

drop——删除多余的一列index

4、删除空值

重置索引后的表格为

表中30列后的值均为空值,需要删除

用空值数量进行判断,若某一列中空值数量=行数,则证明该列全为空,需要删除

5、生成完整一趟车的信息表

语法扩展
loc、iloc区别

pandas索引函数loc和iloc的区别_pandas loc与iloc区别-CSDN博客

loc基于标签索引、iloc基于位置索引

reset_index()

如何在pandas中使用set_index( )与reset_index( )设置索引 - 知乎 (zhihu.com)

3、数据分析

处理后的表

3.1取表头信息表中所需数据

3.2把表头信息与每辆车挂钩

原数据(2个表)

表头表

车次表

通过索引和步长取出需要的信息行

这样就匹配成功了

3.3、取所有站点

3.4循环所有站点取数据(用定位)

都用条件筛选

3.5整体操作(合并前面操作)

语法扩展

python dataframe是什么_Pandas 库之 DataFrame-CSDN博客

4、封装函数

5、数据导出

语法扩展
glob——查找文件

Python标准库glob模块详解_python glob-CSDN博客

tpdm——进度条

【python第三方库】tqdm简介_python tqdm库-CSDN博客

enumerate() 函数

Python enumerate() 函数 | 菜鸟教程

to_csv()

pandas的to_csv()使用方法_pandas to_csv-CSDN博客

总体代码

import warnings
warnings.filterwarnings('ignore')
import pandas as pdpath = './201501-201603/201501/20150101.xls'
data = pd.read_excel(path, skiprows=2, header=None)
data.head(50)# 日期
dates = path.split('/')[-1][:8]ind = data[0].apply(lambda x: '客座率' in x) # 筛选有车次信息的行数据
car_info = data.loc[ind, 0]
car_info = car_info.str.split(' ', expand=True) # 这里的得到车次、定员、客座率car_info# 删除车次信息行
data = data[~ind]
data.reset_index(inplace=True, drop=True)
data.head()## 接下来:找到某一趟车所在的小表格,思路就是找到【上车站、上车人数合计】所在的行
ind = data[0].apply(lambda x: '上车站'==x or '上车人数合计'==x)
car_index = data[ind]all_car = pd.DataFrame()
for start, end, checi, dingyuan, kezuolv in zip(car_index.index[0::2],car_index.index[1::2], car_info[0], car_info[6], car_info[8]):one_car = data.iloc[start:end+1, :] # 截取其中一趟车的数据one_car.reset_index(inplace=True, drop=True) # 重置索引col_ind = one_car.isna().sum(axis=0)==len(one_car) # 判断全为空的列one_car = one_car.loc[:, ~col_ind] # 删除空列station = one_car.iloc[2:-1, 0] # 取所有站点,在2至倒数第一行one_car_list = []for s in station: # 循环每个站点去取数据one_car_dict = {}one_car_dict['车次'] = checione_car_dict['定员'] = dingyuanone_car_dict['客座率'] = kezuolvone_car_dict['日期'] = datesone_car_dict['站点'] = sone_car_dict['进站时间'] = one_car.loc[one_car[0]==s, 1].values[0] # 进站时间one_car_dict['下车人数'] = one_car.loc[one_car[0]==s, one_car.shape[1]-1].values[0] # 下车人数try:one_car_dict['离站时间'] = one_car.loc[1,one_car.iloc[0]==s].values[0] # 离站时间one_car_dict['上车人数'] = one_car.loc[len(one_car)-1,one_car.iloc[0]==s].values[0] # 上车人数except:one_car_dict['离站时间'] = '--' # 终点站没有出站时间和人数one_car_dict['上车人数'] = '--'one_car_list.append(one_car_dict)one_car_data = pd.DataFrame(one_car_list)break#all_car = pd.concat([all_car, one_car_data])
#这一步结束就能看到处理后表的信息了one_car_datadef get_one_file(path):data = pd.read_excel(path, skiprows=2, header=None) # 读数据dates = path.split('/')[-1][:8] # 日期ind = data[0].apply(lambda x: '客座率' in x) # 筛选有车次信息的行数据car_info = data.loc[ind, 0]car_info = car_info.str.split(' ', expand=True) # 这里的得到车次、定员、客座率data = data[~ind] # 删除车次信息行data.reset_index(inplace=True, drop=True)## 接下来:找到某一趟车所在的小表格,思路就是找到【上车站、上车人数合计】所在的行ind = data[0].apply(lambda x: '上车站'==x or '上车人数合计'==x)car_index = data[ind]all_car = pd.DataFrame()for start, end, checi, dingyuan, kezuolv in zip(car_index.index[0::2],car_index.index[1::2], car_info[0], car_info[6], car_info[8]):one_car = data.iloc[start:end+1, :] # 截取其中一趟车的数据one_car.reset_index(inplace=True, drop=True) # 重置索引col_ind = one_car.isna().sum(axis=0)==len(one_car) # 判断全为空的列one_car = one_car.loc[:, ~col_ind] # 删除空列station = one_car.iloc[2:-1, 0] # 取所有站点,在2至倒数第一行one_car_list = []for s in station: # 循环每个站点去取数据one_car_dict = {}one_car_dict['车次'] = checione_car_dict['定员'] = dingyuanone_car_dict['客座率'] = kezuolvone_car_dict['日期'] = datesone_car_dict['站点'] = sone_car_dict['进站时间'] = one_car.loc[one_car[0]==s, 1].values[0] # 进站时间one_car_dict['下车人数'] = one_car.loc[one_car[0]==s, one_car.shape[1]-1].values[0] # 下车人数try:one_car_dict['离站时间'] = one_car.loc[1,one_car.iloc[0]==s].values[0] # 离站时间one_car_dict['上车人数'] = one_car.loc[len(one_car)-1,one_car.iloc[0]==s].values[0] # 上车人数except:one_car_dict['离站时间'] = '--' # 终点站没有出站时间和人数one_car_dict['上车人数'] = '--'one_car_list.append(one_car_dict)one_car_data = pd.DataFrame(one_car_list)all_car = pd.concat([all_car, one_car_data])return all_carfrom glob import glob
from tqdm import tqdm
all_path = glob('./201501-201603/*/*')
for i,path in tqdm(enumerate(all_path)):data = get_one_file(path)if i==0:data.to_csv('./result.csv', header=True, index=None, encoding='utf8', mode='a')else:data.to_csv('./result.csv', header=None, index=None, encoding='utf8', mode='a')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/602472.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

案例102:基于微信小程序的旅游社交管理系统设计与实现

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

解决VMware 虚拟机 ubuntu 20.04 异常关闭导致虚拟网卡 ens33 无法工作问题

问题描述 由于经常使用 SSH 远程链接 VMware 中的虚拟机 ubuntu,每次关闭都是挂起,时间久了,虚拟机运行有些卡顿了,此时可以通过 Linux 命令重启或者关闭 ubuntu,也可以之间使用 VMWare 中的【虚拟机】-- 【电源】-&g…

如何查看超算上不同节点上CPU利用率、运行情况

CPU利用率查看方法 打开命令行,输入命令 ssh [节点名] # 可通过squeue确认节点名 top # 查看cpu实时利用率同时按CtrlC退出top检测界面。 再在命令行输入 exit退出该节点。 查询自己的作业运行的节点名 打开命令好,输入命令 squeue在nodelist里可以…

【JavaEE】深入理解Java线程池- 多线程篇(12)

文章目录 摘要一、线程池参数的介绍二、线程池的工作流程三、使用Executors创建常见线程池总结 摘要 本文将对Java线程池的参数、工作流程以及使用Executors创建常见线程池进行详细总结,帮助读者深入理解线程池的概念和应用。 一、线程池参数的介绍 线程池的核心…

目标检测YOLO实战应用案例100讲-雾天环境下目标检测

目录 前言 国内外研究现状 图像去雾算法的研究

微服务管家:NestJS 如何使用服务发现 Consul 实现高效的微服务节点管理

前言 在微服务架构中,服务发现是一项基础且关键的功能,它允许服务实例在网络中被动态发现。Consul 是一种服务网格解决方案,提供了服务发现、运行状况检查,过去和现代应用程序的连接等功能。 本教程将向您展示如何在 NestJS 框架…

大津法(OTSU)点云强度信息分割

目录 一、相关介绍 二、计算方法 三、实现代码 四、运行结果 一、相关介绍 大津法是一种灰度图像自适应的阈值分割方法,1979年由日本学者大津提出。大津法根据图像的灰度分布,将图像分成背景和前景两部分,前

SiC电机控制器(逆变器)发展概况及技术方向

SiC电机控制器(逆变器)发展概况及技术方向 1.概述2.电动汽车动力系统设计趋势3.栅极驱动器和驱动电源配置4.结论 tips:资料来自网上搜集,仅供学习使用。 1.概述 2022年到2023年,第三代半导体碳化硅被推上了新的热潮。…

前端uniapp的tab选项卡for循环切换、开通VIP实战案例【带源码/最新】

目录 效果图图1图2 源码最后 这个案例是uniapp&#xff0c;同样也适用Vue项目&#xff0c;语法一样for循环&#xff0c;点击切换 效果图 图1 图2 源码 直接代码复制查看效果 <template><view class"my-helper-service-pass"><view class"tab…

【Vue】灵魂拷问

1、说说Vue的优缺点 优点&#xff1a;渐进式&#xff0c;组件化&#xff0c;轻量级&#xff0c;虚拟dom&#xff0c;响应式&#xff0c;单页面路由&#xff0c;数据与视图分开缺点&#xff1a;单页面不利于seo&#xff0c;不支持IE8以下&#xff0c;首屏加载时间长 2、为什么…

第14课 利用openCV快速数豆豆

除了检测运动&#xff0c;openCV还能做许多有趣且实用的事情。其实openCV和FFmpeg一样都是宝藏开源项目&#xff0c;貌似简单的几行代码功能实现背后其实是复杂的算法在支撑。有志于深入学习的同学可以在入门后进一步研究算法的实现&#xff0c;一定会受益匪浅。 这节课&#…

(Python + Selenium4)Web自动化测试自学Day1

目录 文章声明⭐⭐⭐让我们开始今天的学习吧&#xff01;自动打开Chrome浏览器实现自动搜索元素定位常用的元素定位方式By.IDBy.CLASS_NAMEBy.TAG_NAMEBy.NAMEBy.LINK_TEXTBy.PARTIAL_LINK_TEXTBy.CSS_SELECTOR根据id定位根据class定位根据属性定位组合定位 By.XPATH 文章声明⭐…

js的for嵌套和数组的map+some两种方法实现两个对象数组进行比对,得到一个期望的新数组

项目需求有个数据需要处理,现有两个数组arr1和arr2,其中 arr1为[“香蕉”, “苹果”, “梨子”],arr2为 [{ checked: true, name: “苹果” }] ,现在想实现的目的是,只要有arr1里的项与arr2项里的name一致的话就将其checked设为true,否则设为false,最终得到的数组是arr3,…

#error 在C语言中的作用

1、#error命令是C/C语言的预处理命令之一 #error 是C语言中的预处理指令之一&#xff0c;用于在编译时生成一个错误消息。当编译器遇到 #error 指令时&#xff0c;会立即停止编译&#xff0c;并将指定的错误消息输出到编译器的错误信息中。 在给定的代码中&#xff0c;#error…

ubuntu/linux 如何在虚拟环境中下载MPI-IS mesh

麻了&#xff0c;又碰到这个库了&#xff0c;记录一下&#xff0c;希望对大家有用 下载代码&#xff1a;https://github.com/MPI-IS/mesh 安装libboost-dev sudo apt-get install libboost-dev激活自己的虚拟环境&#xff0c;下面的操作在自己的虚拟环境里进行 在mesh-master…

vivado 不支持的SDC命令

不支持以下SDC命令。 • set_clock_gating_check • set_clock_transition • set_ideal_latency • set_ideal_network • set_ideal_transition • set_max_fanout • set_drive • set_driving_cell • set_fanout_load • set_input_transition • se…

玩转Mysql 二(MySQL的目录结构与表结构)

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。 一、MYSQL目录结构及命令存放路径 1、查看MYSQL数据文件存放路径 mysql> show variables like datadir; 注意:生成环境要提前规划好数据存放目录,存储一般以T为单位闪盘。 2、MYSQL命令存放…

系统学习Python——类(class):静态方法(staticmethod)和类方法(classmethod)-[基础知识]

分类目录&#xff1a;《系统学习Python》总目录 我们可以在类中定义两种方法&#xff0c;它们不需要一个实例就可以被调用&#xff1a;静态方法&#xff08;staticmethod&#xff09;大致与一个类中简单的无实例函数的工作方式类似&#xff0c;而类方法则被传人一个类而不是一个…

Note: A Woman Doctor Lina

A woman doctor Lina 女医生丽娜 Born in a pigs’ nest, Lina led a poor life in her childhood. 出生在猪圈里&#xff0c;丽娜过着贫穷的童年生活。 led nest She was looked down upon by the children of her generation. 她被她同时代的孩子瞧不起。 generation look…

day 38 动态规划(1)

day38 代码随想录 2024.1.6 开始动态规划&#xff01; 递归五部曲&#xff1a; 确定dp数组含义确定递推公式dp数组初始化遍历顺序举例推导dp数组 1. 50斐波那契数列 经典的动态规划入门第一题&#xff0c;直接递归五部曲&#xff0c; 本题递归数组是具体要求的值&#xff0c…