Pandas对于CSV的简单操作
最近在研究pandas对于csv文件的读取以及一些操作,网上的信息比较乱,写篇博客记录一下,毕竟自己写的才是最适合自己的用法.
首先我们应该都知道,pandas是一个用于数据分析,以及可以简单的绘图的一个python模块,本文并不是从零开始介绍这个模块,而是从我最近几天的使用来说的,从我用到的,最实用的那一部分说起.
首先,导入模块,这是必须的
import pandas as pd # 不要问我为什么要简称pd,大家都是这么做的,惯例,日常习惯好伐
import numpy as np
导入模块之后,我们就需要导入CSV文件,对,就是这么直奔主题,我这里不会讲什么series,也不会讲什么numpy数组,那些理论都不实用,我们就是要直接用,碰到问题再去解决.
读取csv文件的方法叫做
read_csv() 读取csv文件
df = pd.read_csv(filename,usecols=[要取的列名])
'''
read_csv的参数很多,有需求可以去查,因为我这里只是用到了要取到的列名,所以只写这一个,当然你可以写encoding="utf-8"来防止读取时候中文有乱码,或者等等之类的.
filename可以是当前文件夹里的文件名,或者是从根目录开始的一个路径,比如下例
usecols = [] 这里写要取的列名,如果不想取csv文件的全部列的话,就在这里设定,如果要取全文件可以不写.
'''
df = pd.read_csv('111.csv',usecols=['teacher','student'])
# 或者
df = pd.read_csv(r'D:PythonStudying111.csv',usecols=['teacher','student'])
# 两种读取方法都可以
# 对于一些数据量比较大的表格,我们可以选择用分块读取的方式来加快读取的速度以及减小系统的内存占用,这种读取方法借鉴于
https://blog.csdn.net/jambone/article/details/78769421
reader = pd.read_csv(filename, encoding="utf_8_sig", sep=',', iterator=True, usecols=line)
i = 0
while True:
try:
start2 = time.clock()
df = reader.get_chunk(1000000)
i = i + 1
end2 = time.clock()
# 每次循环结束时间
print('{} 秒: completed {} rows'.format(end2 - start2, i * 1000000))
except StopIteration:
print("Iteration is stopped.")
# 循环结束退出
break
然后,我们成功读取到之后,可以尝试用print(df)
来查看取到的csv列表
合并一个表中的不同列(单纯的合并,不做计算)
我们可以把读取到的csv表中的不同列合并成一列,其实也不算是合并,只能说是新的生成.
df["User"] = df["ClientID"].map(str)+df["UserID"].map(str)+df["phone"].map(str)
# 我们知道,只有字符串或者数值之间才能直接相加,所以我们要清楚的知道自己合并的这几列是什么格式的数据,如果当做字符串合并,那么就在每列结尾用map(str),如果要用数值相加,那么要用map(float)或者map(int)
# 这样合并原来的列并不会消失,只是会形成一个新列,默认在整个表的尾部,也就是最后一列,如果需要把原列删除再调用drop即可
apply() 一个表中的不同列,行之间做计算
tablename['time'] = df.apply(
lambda x: x['second']+x['minute']*60),
axis=1)
# 上面语句的意思就是,把名为second的列的值加上名为minute的列的值乘以60,作为一个叫做time的新列
# lambda 是匿名函数的意思,即传入一个x参数,返回的是冒号后面的式子的结果
# axis的参数和上文相同,0代表对行操作,1代表对列操作
# 要注意一点,apply是一个非常耗时的操作,数据量较大的话要慎用这个函数,我曾经测试过,60W行的csv表,对列做操作,用apply耗时20s,直接用列操作只用时5s,所以要注意
# 直接用列之间操作如下:
tablename['time'] = tablename['second']+tablename['minute']*60
drop() 删除表中列,行
# 删除某一列或者某一行,用drop
df.drop(columns=line_name,axis)
# 第一个参数columns即为你要删除的列或者行的名字,可以是一个值,也可以是一个队列多个值
# 第二个参数axis则是你要删除的是列还是行:
# axis=0,就是删除名为line_name的行
# axis=1,就是删除名为line_name的列
merge() 合并两个表
pd.merge(table1, table2, on=line_name,how = )
# merge是合并函数,前面两个参数即为要合并的两个表的名称
# 第三个参数on,是按照某一列或者某些列来合并表,比如on=['student','teacher'],就是同时按照这两列来合并表,作为key
# 第四个参数how,就是合并的方式,可填参数为inner内联,left左连接,right右连接,outer全连接,这里解释一下这几种合并方式的区别
1. inner 内联,即两个表以key为关键字合并之后,如果某个其余列有空的数值,那么这一列将不会保留,即内联方式只会保留两个表相对于key都有数据的行,或者列,有空数据都不会保留
2. left 左连接,即左边的所有数据都会保留,也就是table1的数据,右表如果有空数据,会自动填入null
3. right 右连接,原理同左连接,换个方向而已
4. 全连接,即两边表的所有数据都会保留,如果有空数据都会自动填入null
# 实例:
pd.merge(df1, df2, on=["student","teacher"],how = "outer")
to_csv() 创建新表
# 当我们读入一些csv表,然后对他们操作完毕之后,我们就需要把处理之后的数据输出,重新生成一个表,就要用到这个函数
df.to_csv(filename, encoding="utf_8_sig")
# 第一个参数就是你要生成的文件名,只写一个文件名的话会默认生成到你的py文件所在的目录,当然可以写一个从根目录开始的路径,注意要加引号
# 第二个参数一定要加,这个参数可以避免重新生成的csv表里面的中文出现乱码
这都是对csv表的基本操作,还在学习当中,持续更新ing........