方法精简例子丰富
经常用到pandas数据文件的保存和读取方法,如果每次忘了都去查官方文档还蛮麻烦的。所以我这里整理了两个常用数据格式文件的存取方法。
其中介绍到的参数使用技巧都是常用的,避免介绍一些冷门的,听了以后也几乎用不到的东西。
如果我日后接触到更多的数据格式存取,或者又学会了其他实用技巧,本文还会更新。
如果以下参数使用方法你都会了,之后的内容就不用看啦。
保存CSV文件的函数是DataFrame.to_csv(),下面是该函数常用的参数,官方文档里有10多个参数,实际上绝大部分情况中只用到下面这几个参数,其他参数就不介绍了。
先来总体看下常用参数的默认值。
df.to_csv(path_or_buf="filename.csv" , # 保存文件的路径
columns=None, # 默认保存所有列
header=True, # 默认保存列索引
index=True) # 默认保存行索引
用pd.read_csv()读取CSV文件。有6个常用的参数。
pd.read_csv(filepath_or_buffer="filename.csv", # 文件读取路径
header="infer", # 默认第1列是列索引
names=None, # 用于自定义列索引,不自定义列名
nrows=None, # 用于选择读取前X行,默认读取所有行
usecols=None, # 可以用于选择读取特定的列,默认读取所有列
index_col=None, # 用于指定某列的元素作为行索引,默认自动生成行索引
skiprows=None )# 用于选择跳过开头的X行,默认不跳过
如果你需要自己跑一下代码,建议用JupyterNote Book来跑,然后需要先阅读并执行简单创建一个DataFrame部分的代码,这部分代码提供了一个范例,帮助理解例子中参数的使用。
也可以从头到尾看完9个例子,下文的例子都是连贯的。
学会了csv文件的存取,就等于学会了Excel文件的存取,Excel与CSV文件存取方式上有微小的区别,区别具体见
先简单创建一个DataFrame用作范例介绍CSV文件和Excel文件的保存,然后再读取刚刚保存的文件作为演示。
import pandas as pd
# 用字典创建一个DataFrame,key是列名,value是一列的值
students = {'name': ["Lily","Amy","Jack","Alex"],
'height': [168.7, 172.3, 175.4, 182.1],
'weight': [51.5, 49.8, 63.2, 81.5]}
df = pd.DataFrame(students)
创建好后df
的内容应该是下面这样的,如果不指定行索引,pandas
会自动帮你生成一个从0开始的行索引。这里说明一下行索引和列索引的概念:
[name, height, weight]
name height weight
0 Lily 168.7 51.5
1 Amy 172.3 49.8
2 Jack 175.4 63.2
3 Alex 182.1 81.5
回到例子列表
最简单的保存方法就是用DataFrame.to_csv()
只填上文件名参数来保存。
但这里有个问题
保存的时候会默认保存索引,读取的时候会自动生成索引所以当你用pd.read_csv()
读取文件的时候会出现索引重复的问题。
df.to_csv("students.csv")
df2 = pd.read_csv("students.csv")
df2
保存后students.csv
的内容:
,name,height,weight
0,Lily,168.7,51.5
1,Amy,172.3,49.8
2,Jack,175.4,63.2
3,Alex,182.1,81.5
读取students.csv
后df2
的内容:
Unnamed: 0 name height weight
0 0 Lily 168.7 51.5
1 1 Amy 172.3 49.8
2 2 Jack 175.4 63.2
3 3 Alex 182.1 81.5
可以看到,多出来了一列Unnamed:0
,有两个方法可以解决重复索引问题。
回到例子列表
一是不保存索引
df.to_csv("students.csv", index=None)
df2 = pd.read_csv("students.csv")
二是读取的时候指定索引列
df.to_csv("students.csv")
df2 = pd.read_csv("students.csv", index_col=0)
用这两种方法读取后df2
的内容都是:
name height weight
0 Lily 168.7 51.5
1 Amy 172.3 49.8
2 Jack 175.4 63.2
3 Alex 182.1 81.5
方法2保存的文件内容跟之前的一样。
方法1保存的文件内容变成下面这样了。
name,height,weight
Lily,168.7,51.5
Amy,172.3,49.8
Jack,175.4,63.2
Alex,182.1,81.5
个人推荐使用方法1避免重复生成行索引的问题。下面的例子还会用到students.csv
这个文件,且是用方法1保存的,文件内容如上。
如果只是简单学习下怎么用DataFrame.to_csv()
和pd.read_csv()
存取文件,到这步就差不多可以了。下面会再拓展一点关于CSV存取文件的一些常用参数。
先回顾DataFrame.to_csv()
常用参数的默认值。
df.to_csv(path_or_buf , # 保存文件的路径
columns=None, # 默认保存所有列
header=True, # 默认保存列索引
index=True) # 默认保存行索引
回到例子列表
下面跟上述参数的默认值反着干。
保存一个只有名字和体重的没有行索引和列索引的CSV文件。
df.to_csv("students.csv" , # 保存文件的路径
columns=["name","weight"], # 只保存名字和体重列
header=False, # 不保存列索引
index=False) # 不保存行索引
df2 = pd.read_csv("students2.csv")
df2
students2.csv
的内容:
Lily,51.5
Amy,49.8
Jack,63.2
Alex,81.5
读取students2.csv
后df2
的内容:
Lily 51.5
0 Amy 49.8
1 Jack 63.2
2 Alex 81.5
这里又发现了一个问题,因为pandas
的pd.read_csv()
读取文件时会自动把第一列作为列索引,所以如果不保存列索引的话,读取的时候第一列数据就会变成列索引了。
但有的时候我们得到的数据就是没有列索引的。这时候的解决方法是:读取数据文件的时候不以第一行作为列索引。
df2 = pd.read_csv("students2.csv",header=None) # 不以第一行作为列索引
df2
读取students2.csv
后df2
的内容:
0 1
0 Lily 51.5
1 Amy 49.8
2 Jack 63.2
3 Alex 81.5
pandas
自动给数据生成了一个从0开始的列索引。可能有同学想自己给这些列索引命名,那就继续看pd.read_csv()
的常用参数拓展吧~
惯例总体看下pd.read_csv()
常用参数的默认值。
import pandas as pd
pd.read_csv(filepath_or_buffer, # 文件读取路径
header="infer", # 默认第一列是列索引
names=None, # 不自定义列名
nrows=None, # 用于指定行索引是哪列,默认自动生成行索引
usecols=None, # 默认读取所有列
index_col=None, # 默认读取所有行
skiprows=None )# 默认不跳过开头的行
由于参数略多,我就分开介绍例子了。接下来展示的例子会用到之前保存的students.csv
和students2.csv
文件,不记得文件内容的话可以回到前面看看。
回到例子列表
header
用来选择哪一行作为列索引,可以填一个整数,填0表示第1行作为列索引,填5表示第6行作为列索引。填None表示默认不选任何行做为列索引,而是自动生成一个从0开始的列索引。names
当不选header=None
是,可以通过设置这个参数来自定义列索引。利用刚才保存的students2.csv
文件,读取并自定义列索引。
df2 = pd.read_csv("students2.csv",
header=None, # 默认不读取列索引
names=["姓名","体重"]) # 给这两列自定义列索引
df2
读取students2.csv
后df2
的内容:
姓名 体重
0 Lily 51.5
1 Amy 49.8
2 Jack 63.2
3 Alex 81.5
回到例子列表
nrows
可以设置读取行数的数量,有时候不想读取所有数据,只是想读个几行看看数据长啥样就可以用这个参数。usecols
可以选择读取哪几列,有时候你数据文件有几万列,但你可能只需要用某几列就够了,就可以用这个参数。读取students.csv
文件,只读取身高和体重列,且只读取前2行的数据。
df2 = pd.read_csv("students.csv",
usecols=["height","weight"], # 只读身高和体重列
nrows=2) # 只读取前两行的数据
df2
读取students.csv
后df2
的内容:
height weight
0 168.7 51.5
1 172.3 49.8
回到例子列表
index_col
这个参数可以指定某一列作为数据的行索引读取students.csv
文件,以name
的数据作为行索引。
df2 = pd.read_csv("students.csv",
index_col="name")
df2
读取students.csv
后df2
的内容:
name height weight
Lily 168.7 51.5
Amy 172.3 49.8
Jack 175.4 63.2
Alex 182.1 81.5
但有时候CSV文件可能没有列索引,比如students2.csv
这时候也可以用数字作为参数选择作为行索引的列。以第一列作为行索引。注意要加上header=None
避免第一行数据被作为列索引。
df2 = pd.read_csv("students2.csv",
header=None, # 避免第一行数据被作为列索引
index_col=0)
df2
读取students2.csv
后df2
的内容:
0 1
Lily 51.5
Amy 49.8
Jack 63.2
Alex 81.5
回到例子列表
skiprow
是用来跳过CSV文件开头几行的,一般用在一些不太标准的文件上,比如有些文件开头几行是数据的介绍,数据集的名称之类的。之后几行才是CSV数据格式的内容。比如:introduction: this is a students list.
creater:Light2077
name,height,weight
Lily,168.7,51.5
Amy,172.3,49.8
Jack,175.4,63.2
Alex,182.1,81.5
读取这样的文件时,你可以手动删除这开头多余的两行,但是如果你在读取成千上万个这样的文件时,手动能把你累死。。最好的方法还是用pd.read_csv("filename",skiprows=2)
有时不需要读取列索引时,skiprows
也可以用来跳过列索引
读取students.csv
文件,跳过第一行。
df2 = pd.read_csv("students.csv",
skiprows=1)
df2
读取students.csv
后df2
的内容:
Lily 168.7 51.5
0 Amy 172.3 49.8
1 Jack 175.4 63.2
2 Alex 182.1 81.5
跳过了列索引,但pandas
会默认以跳过的行之后的下一行数据作为列索引。
其实学会了csv文件的存取,就几乎等于学会了Excel文件的存取,只不过Excel有工作表(sheet)这个概念,一个Excel文件可能会有多个工作表,需要分别读取和保存不同的工作表。
这里的例子还是使用一开始创建的DataFrame
DataFrame.to_excel(PATH, sheet_name=’’)
pd.read_excel(PATH, sheet_name=’’)
回到例子列表
import pandas as pd
# 用字典创建一个DataFrame,key是列名,value是一列的值
students = {'name': ["Lily","Amy","Jack","Alex"],
'height': [168.7, 172.3, 175.4, 182.1],
'weight': [51.5, 49.8, 63.2, 81.5]}
df = pd.DataFrame(students)
excel文件保存,将df
保存在students3.xlsx
里:
df.to_excel("students3.xlsx")
students3.xlsx
文件里的内容
name height weight
0 Lily 168.7 51.5
1 Amy 172.3 49.8
2 Jack 175.4 63.2
3 Alex 182.1 81.5
然后利用之前所学的知识展示,把df
拆分保存到students4.xlsx
里,其中:
with pd.ExcelWriter("students4.xlsx") as writer:
df.to_excel(writer, sheet_name='sheet1', columns=["name"])
df.to_excel(writer, sheet_name='sheet2', columns=["height", "weight"])
students4.xlsx
sheet1里的内容
name
0 Lily
1 Amy
2 Jack
3 Alex
students4.xlsx
sheet2里的内容
height weight
0 168.7 51.5
1 172.3 49.8
2 175.4 63.2
3 182.1 81.5
回到例子列表
读取的时候如果不指定sheet_name
,默认读取第一个工作表的内容。
excel与csv文件读取的方式几乎相同,就不做多介绍了。
这里展示一个读取students4.xlsx
工作表sheet2,指定第一列为行索引且只读取前两行数据的例子:
df2 = pd.read_excel("students4.xlsx", sheet_name="sheet2",index_col=0, ncols=2)
df2
df2
的内容为:
height weight
0 168.7 51.5
1 172.3 49.8
保存的students4.xlsx
sheet2里的内容
height weight
0 168.7 51.5
1 172.3 49.8
2 175.4 63.2
3 182.1 81.5