前言:
本文大致讲述了,如何从一个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
遍历后的时间列表与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():
- filepath_or_buffer:第一个参数也是必须有的参数,为读取目标文件的路径
- names=[]: 读取后自行设置列名即表头
- 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)