Python数据处理,利用Pandas合并csv文件、剔除无效行、做某列计算和格式化输出

测试工作中经常遇到一种情况就是你有两个csv文件,比如一个是车辆底层的CAN数据组成的csv,一个是定位GPS数据组成的csv,它们两个公用一套时间戳,现在想把两个csv合并到一个地方进行计算和处理,那么首先就需要把两个文件读取到同一个表中,按照时间戳进行对齐,然后剔除一些明显无效的数据。

1、涉及到的内容

Pandas是python下最强大的数据分析和探索工具,它包含高级的数据结构和精巧的工具,使得在python中处理数据非常快速和简单。

Pandas构建在Numpy之上,它使得以Numpy为中心的应用很容易使用。
Pandas的名称来自于面板数据(Panel Data)和python数据分析(Data Analysis),最初由AQR Captial Management开发出来,用作金融数据分析。

Pandas的功能非常强大,支持类似于SQL的数据增、删、查、改,并且带有丰富的数据处理函数;支持时间序列分析功能;支持灵活处理缺失数据等。

Pandas基本的数据结构是Series和DataFrame。
Seiries就是序列,类似一维数组。为了定位Seiries中的元素,Pandas提供了Index对象,每个Series都会带有一个对应的Index,用来标记不同的元素,Index的内容不一定是数字,也可以是字母、中文等,它类似SQL中的主键。
DataFrame则是相当于一张二维的表格,类似二维数组,它的每一列都是一个Seiries。
DataFrame相当于多个带有同样index的Series的组合(本质是Series的容器),每个Seiries都带有唯一的表头,用来标识不同的Seiries。

Pandas merge功能
pandas中的merge()函数类似于SQL中join的用法,可以将不同数据集依照某些字段(属性)进行合并操作,得到一个新的数据集。
Pandas isin功能
isin()接受一个列表,判断该列中元素是否在列表中,求逆的话可以把剩下的保留下来
Map lambda功能
Series的map方法可以接受一个函数或含有映射关系的字典型对象。
使用map是一种实现元素级转换以及其他数据清理工作的便捷方式。

Pandas loc功能
loc和iloc可以对Pandas的行或者列进行切片处理

2、Python代码实现

简单介绍一下,相关的解释在代码注释里已经注释的很清楚了,在这边不做赘述。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on 20200320

@author: zhongweidu
need python3 + pandas
intall it in termianl by:
sudo apt-get install python3-pandas
how to use it : 
python3 test.py data1.csv  data2.csv
"""

import sys
import pandas as pd

input_file1 = sys.argv[1]
input_file2 = sys.argv[2]

csv_data1 = pd.read_csv(input_file1,error_bad_lines=False)   ## 读取出错的行直接就扔掉了
csv_data2 = pd.read_csv(input_file2,error_bad_lines=False)

# 以csvdata1为引子,按照两个的time进行匹配,把csvdata2加入csvdata1里去;
# how参数中left是以左边为准,right是以右边为准,outer取交集
merged_data = pd.merge(csv_data1,csv_data2,how='left',left_on='time',right_on='time')  
# 去除经度等于0.000000的行,其他条件可依次类推
clear_zero_data = merged_data[~merged_data["longitude"].isin([0.0000000])]

# map方式可以用lambda也可以对列进行加减除运算,依次类推
# clear_zero_data['steering_info'] = clear_zero_data['steering_info'].map(lambda x: x+1000)

##保留longitude有效数字为7位;
clear_zero_data['longitude'] = clear_zero_data['longitude'].map(lambda x: ('%.7f')%x)
clear_zero_data['latitude']= clear_zero_data['latitude'].map(lambda x:('%.7f')%x)

## 分别输出CAN文件和TRK文件  名字可以根据传参自动命名,具体可以任意修改
outfile1 = clear_zero_data.loc[:,['time','longitude','latitude','speed']]
outfile2 = clear_zero_data.loc[:,['time','driving_mode','park_status','back_status','lamp_status','braking_info','steering_info','accelerator_info','horn_info']]
outfile1.to_csv("data1_new.csv",index=False)
outfile2.to_csv("data2_new.csv",index=False)

print("Finished!!!")

你可能感兴趣的:(python学习)