使用Python(pandas库)处理csv数据

前言:

本文大致讲述了,如何从一个csv文件,读取指定列并且拼接成最后所需样式csv的过程,,可以看完再通过循环的方式对大量文件夹内的csv进行提起整合成一个大的csv。

(注:本文写于做毕设期间,有处理大量csv文件的需要,故使用python强大的库资源来处理数据,希望对有需要的你提供帮助和启发)

使用Python(pandas)处理数据

原始数据和处理之后的样式

图中为一个csv文件,待处理的csv文件总共有2410个

原始数据
原始数据

目标样式
处理样式

1.导入os、pandas和numpy库

import os
import pandas as pd
import numpy as np

2.筛选出csv文件中的指定行(列)

time = pd.read_csv(info, skiprows=[0], nrows=1, usecols=[6], header=None)   # 遍历时间列 但一个csv只读一次
rss = pd.read_csv(info, skiprows=[0], usecols=[4], header=None)     # 跳过第0行即表名行 遍历所有csv文件的rss列

pd.read_csv()的参数
1.filepath_or_buffer : 各种文件的路径(a str,pathlib.Path或py._path.local.LocalPath),URL(包括http,ftp和S3位置)或带有read()方法的任何对象(例如打开的文件或 StringIO)
2.skiprows=[ ] : 指定读取csv文件时忽略的行号
3.nrows = 1: 指定读取的行数为1,即只读取第一行
4.usecols= [] : 指定读取的列数的列号
5.header = None : 指定不读取原始数据的表头即列名1

也可以先全部读入,使用dataframe的iloc或者loc方法筛选所需要的行列


3.利用数组和numpy进行转置

arr_time = time.values
arr_t_T = arr_time.reshape(np.size(arr_time, 1), np.size(arr_time, 0))    # 利用numpy返回的行数和列数,再将其给数组的reshape方法

arr_rss = rss.values
arr_rss_T = arr_rss.reshape(np.size(arr_rss, 1), np.size(arr_rss, 0))  # 利用numpy返回的行数和列数,再将其给数组的reshape方法

1.数组的reshape函数:reshape()是数组array中的方法,作用是将数据按行列重新组织
2.np.size:如果传入的参数只有一个,则返回矩阵的元素个数
如果传入的第二个参数是0,则返回矩阵的行数
如果传入的第二个参数是1,则返回矩阵的列数

data_t = pd.DataFrame(arr_t_T)
data_r = pd.DataFrame(arr_rss_T)                                         # 赋值给相应的DataFrame

再将其传给相应的DataFrame.
pandas也可以用转置的方法输出,不过在本文中因为有后续操作,所以用数组和numpy完成转置,不易出错。


4.遍历整个文件夹中的csv文件


for info in os.listdir('H:/Ex 1.12'):
    domain = os.path.abspath('H:/Ex 1.12')
    info = os.path.join(domain, info)   # 遍历整个文件夹

利用os模块的方法和for循环实现遍历文件夹的功能

1.os.listdir(path): path为目标文件夹路径 返回:指定路径下的文件和文件夹列表

2.os.path.abspath(file): 获取当前文件的绝对路径

3.os.path.join()函数: 连接两个或更多的路径名组件;如果各组件名首字母不包含’/’,则函数会自动加上 ;如果有一个组件是一个绝对路径,则在它之前的所有组件均会被舍弃;如果最后一个组件为空,则生成的路径以一个’/’分隔符结尾

**这个循环中先是获取目标路径文件夹中的所有文件,再将其转为绝对路径,这样在下一步os.path.join功能中跳过已经读取过的文件,从而完成遍历操作。


5.利用pd.concat在csv文件中添加一列(行)

lb1 = pd.DataFrame({'label': ['Ex 1.12']})
data_l = pd.DataFrame(lb1)                                                        # 增加label列

首先利用之前的循环结构得到一个列名为label,内容全为Ex1.12的1*2410的列表

    database_1 = pd.concat([data_t, data_r], axis=1, sort=False)
    database_2 = pd.concat([database_1, data_l], axis=1, sort=False)                # 整合三个DataFrame

利用 pd.concat()方法将之前得到的三列数据整合在一起,
pd.concat(): pd.concat(objs, axis=0, join=‘outer’, join_axes=None, ignore_index=False,keys=None, levels=None, names=None, verify_integrity=False)
objs: series,dataframe或者是panel构成的序列lsit
axis: 需要合并链接的轴,0是行,1是列
join:连接的方式 inner,或者outer

得到的效果如下图:

database_1
database_1
遍历后的时间列表与rss列表组合并接在一起

data_l
在这里插入图片描述
database_2
在这里插入图片描述
最后将循环得到的 label列利用pd.concat并接在一起


6.pandas读取和输入csv文件

    database_2.to_csv('ex-1.12.csv', mode='a', index=False, header=False)         # 输出到csv文件中,当mode='a'时,可遍历输出

    df = pd.read_csv('ex-1.12.csv', names=['Ex 1.9', 'Ex 1.10',	'Ex 1.11', 'Ex 1.12', 'ElevatorHall(North)',
    'Ex 1.8', 'Ex 1.7', 'Elevator Hall (North)', 'Ex 1.6', 'Ex 1.5', 'Elevator Hall (South)', 'Exam Teamwork F1',
    'Clean', 'ElevatorHall(South)', 'Ex 1.4', 'Ex 1.3	', 'Ex 1.2', 'Ex 1.1', 'Sub-Wait', 'Main Hall (Entrance)', 'label'],
    header=None)
#  读取输出的csv文件,加上表头

pd.read_csv():

  1. filepath_or_buffer:第一个参数也是必须有的参数,为读取目标文件的路径
  2. names=[]: 读取后自行设置列名即表头
  3. header = False/True 是否忽略原列表第一行

df.to_csv()
1.file: 输出文件名,默认路径为py工程所在目录
2. mode =‘a’ : 读取方式,当为a时为累加的输出方式,将新内容输出一直输出到目标文件中
3. index=;header=; 是否输出原数据的行索引和列名

最终效果如下图:
在这里插入图片描述


7.结束和分享

最后将所有文件处理好生成所需样式的csv文件,每一个csv文件有2410行,代表每个文件夹里原始的2410个csv文件

在这里插入图片描述

大功告成,这是处理一个文件夹中的2410个csv文件之后得到新csv文件,提取了原始数据中需要的内容,并整合为一个csv,当有大量csv文件需要处理时,利用python强大的库资源可以让工作效率大大提升。
这也是本人第一次使用pandas库,也是第一次写博客,绕了不少弯路,也感谢强大的网友们,提供了许多帮助,希望我写的内容也会对你有所帮助。

下面贴一个官方库链接,可以用Chrome浏览器翻译浏览。
pandas库官方文档链接:(https://pandas.pydata.org/docs/user_guide/io.html#io-read-csv-table)

  • 9
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值