Fork me on GitHub

Pandas读存CSV文件

Pandas读存CSV文件

文本记录的是如何使用Pandas来读取和保存CSV文件。

详细的参数请参考官网:https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html

官方参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
read_csv(filepath_or_buffer,
sep=NoDefault.no_default,
delimiter=None,
header='infer',
names=NoDefault.no_default,
index_col=None,
usecols=None,
squeeze=None,
prefix=NoDefault.no_default,
mangle_dupe_cols=True,
dtype=None,
engine=None,
converters=None,
true_values=None,
false_values=None,
skipinitialspace=False,
skiprows=None,
skipfooter=0,
nrows=None,
na_values=None,
keep_default_na=True,
na_filter=True,
verbose=False,
skip_blank_lines=True,
parse_dates=None,
infer_datetime_format=False,
keep_date_col=False,
date_parser=None,
dayfirst=False,
cache_dates=True,
iterator=False,
chunksize=None,
compression='infer',
thousands=None,
decimal='.',
lineterminator=None,
quotechar='"',
quoting=0,
doublequote=True,
escapechar=None,
comment=None,
encoding=None,
encoding_errors='strict',
dialect=None,
error_bad_lines=None,
warn_bad_lines=None,
on_bad_lines=None,
delim_whitespace=False,
low_memory=True,
memory_map=False,
float_precision=None,
storage_options=None)

下面是对部分参数的解释:

  1. filepath_or_buffer:文件路径或者在线缓存的数据
  2. sep:指定的分隔符,默认是,
  3. delimiter:作用和sep是类似的
  4. header:文件头,默认是数据第一行;如果指定为None,则用自然数0,1,2,3等表示
  5. names:指定文件列名
  6. index_col:指定将哪列作为行索引
  7. usecols:指定读取的列,可以是数字或列名
  8. squeeze:如果将squeeze设置为True,文件中只包含一列,则返回一个Series型的数据;如果有多列,则返回DataFrame型数据
  9. prefix:如果原始数据没有列名,通过该参数加上前缀,此时headers参数为None
  10. dtype:指定数据类型
  11. engine:解析引擎,一般是c或者python
  12. converters:针对列进行处理。指定列名和处理的函数,最终通过字典的形式传入
  13. nrows:指定读取的行
  14. skip_blank_lines:是否跳过空白行,默认是True

在一般情况下,会将读取到的数据返回成一个Pandas的DataFrame形式的数据。

导入库

1
2
3
import pandas as pd
import numpy as np
import io

参数1:filepath_or_buffer

本地数据

  • 读取本地csv文件
  • 路径可以是相对路径,也可以是绝对路径

In [3]:

1
2
3
4
5
6
# 绝对路径:当前路径
df = pd.read_csv("Pandas_for_CSV.csv")

# 完整的绝对路径
df1 = pd.read_csv(r"/Users/peter/Desktop/pandas/Pandas_for_CSV.csv")
df1.head()

在线数据

读取某个URL地址下的在线公开数据集:

1
2
3
4
5
6
7
8
9
10
11
12
13
url = "https://raw.githubusercontent.com/hunkim/DeepLearningZeroToAll/master/data-03-diabetes.csv"

# 方式1
data = pd.read_csv(url,header=None)

# 方式2
import io
import requests
# 先发送请求
r = requests.get(url).content.decode('utf-8')
# 通过 io.StringIO 函数进行转换
data = pd.read_csv(io.StringIO(r),header=None)
data.head()

参数2:sep

指定分割的符号。CSV的文件默认是英文的逗号来分割的:,。另外常见的还有制表符(\t)、空格等,我们可以根据数据的实际情况来进行传值。

sep的默认取值也是英文的逗号

In [9]:

1
2
df = pd.read_csv("Pandas_for_CSV.csv", sep=",")  # 默认
df.head()

其他分隔符:

1
2
3
# 数据分隔符默认是逗号,可以指定为其他符号
# pd.read_csv(data, sep='\t') # 制表符分隔tab
# pd.read_csv(data, sep='|') # 制表符分隔tab

还可以同时使用多个符号,传入的是正则表达式。

下面的例子中表示的是使用|或者,来进行分割;当使用的是正则表达式,engine参数一定是python

In [11]:

1
# pd.read_csv(data,sep=r'/|,', engine='python') # 使用正则表达式

参数3:delimiter

备选的分隔符,作用和sep是类似的;如果指定了delimiter参数,则sep参数会失效

In [12]:

1
2
df = pd.read_csv("Pandas_for_CSV.csv", delimiter=",")
df.head()

参数4:header

指定读取的文件头;默认是第一行当做表头,如果是None则没有表头,使用自然数当做表头。

支持单个整数或者整数组成的列表:

默认情况下将数据的第一行当做文件的头:

In [13]:

1
2
3
4
# 默认情况读取

data = pd.read_csv(url)
data.head(3)

指定为None之后,第一行不再是表头,而是使用自然数做表头:

In [14]:

1
2
3
4
# 指定header为None

data = pd.read_csv(url,header=None)
data.head(3)

Out[14]:

1
2
3
# 读取本地文件
df = pd.read_csv("Pandas_for_CSV.csv",header=[0])
df.head()

下面的例子是将多行当做表头,由数字组成的列表:

In [16]:

1
2
df = pd.read_csv("Pandas_for_CSV.csv",header=[0,2])
df.head()

Out[16]:

参数5:names

用来指定文件的列名,也是一个列表对象。

在线数据的读取也可以指定names参数:

参数6:index_col

指定行索引列

image-20220508104414894

指定多层索引:

1
2
3
4
df = pd.read_csv("Pandas_for_CSV.csv",index_col=[0,1])
# 效果同上
# df = pd.read_csv("Pandas_for_CSV.csv",index_col=["id","name"])
df.head()

参数7:usecols

指定查看的列属性信息,可以是索引号或者直接使用列名:

参数8:squeeze

如果将squeeze设置为True,文件中只包含一列,则返回一个Series型的数据;如果包含有多列,则还是返回DataFrame型数据

In [27]:

1
2
3
# 默认返回的是DataFrame
df = pd.read_csv("Pandas_for_CSV.csv",usecols=[0])
df.head()

Out[27]:

In [28]:

1
2
3
4
# 加上squeeze参数,返回的是Series型数据

df = pd.read_csv("Pandas_for_CSV.csv",usecols=[0],squeeze=True)
df.head()

Out[28]:

1
2
3
4
5
6
0    S001
1 S002
2 S003
3 S004
4 S005
Name: id, dtype: object

In [29]:

1
2
df = pd.read_csv("Pandas_for_CSV.csv",usecols=[0,1],squeeze=True)
df.head()

Out[29]:

参数9:prefix

如果原始数据没有列名,通过prefix参数给表头加上一个前缀;此时header参数一定是None

In [30]:

1
2
df = pd.read_csv(url, prefix="n", header=None)
df.head()

参数10:mangle_dupe_cols

针对列名中有重复名称的处理,可以将重复的列名自动解析为col.1,col.2,col.3等

In [31]:

1
2
df = pd.read_csv("Pandas_for_CSV_1.csv",mangle_dupe_cols=False)
df

参数11:dtype

指定读取字段的数据类型,通常是以字典的形式出现

In [33]:

1
2
3
4
df = pd.read_csv("Pandas_for_CSV.csv")

# 查看列名的字段类型
df.dtypes

Out[33]:

1
2
3
4
5
6
7
8
9
id         object
name object
age int64
sex object
address object
time int64
year int64
month int64
dtype: object

In [34]:

1
2
3
4
df = pd.read_csv("Pandas_for_CSV.csv", dtype={"age":"float32"})

# 查看列名的字段类型:已经变成了float32
df.dtypes

Out[34]:

1
2
3
4
5
6
7
8
9
id          object
name object
age float32
sex object
address object
time int64
year int64
month int64
dtype: object

参数12:engine

读取数据时的解析引擎,一般是C、PyArrow、或者Python;C和PyArrow的速度是相对快的,但是Python的功能最强。

补充知识点:

Apache arrow是高性能的,用于内存计算的,列式数据存储格式。PyArrow是apache arrow的python库,PyArrow与NumPy、pandas和内置的Python对象有很好的集成。它们是基于Arrow的C++实现。

In [35]:

1
2
# pd.read_csv("Pandas_for_CSV.csv", engine="c")
# pd.read_csv("Pandas_for_CSV.csv", engine="python")

参数13:converters

针对列进行处理。指定列名和处理的函数,最终通过字典的形式传入

In [36]:

1
2
3
# 默认
df = pd.read_csv("Pandas_for_CSV.csv")
df.head()

实施改变1:名称name的首字母变成大写

In [37]:

1
2
3
4
5
6
7
# Python中的title实现
# 1-表示索引号

df = pd.read_csv("Pandas_for_CSV.csv",
converters={1: lambda x:x.title()}
)
df.head()

实施改变2:同时传入列名和对应的函数

In [38]:

1
2
3
4
5
6
7
# 自定义改变姓名内容的函数

def change_sex(x):
if x == "male":
return 0
else:
return 1

In [39]:

1
2
3
4
5
6
7
8
df = pd.read_csv(
"Pandas_for_CSV.csv",
usecols=[1,3],
converters={
1: lambda x: x.title(), # 首字母大写
3: lambda x: change_sex(x) # 传入自定义函数
})
df.head()

参数14:true_values、false_values

将指定内容的文本转成True或者False

In [40]:

1
2
3
4
5
df = pd.read_csv("Pandas_for_CSV.csv",
true_values=['male'],
false_values=['female']
)
df.head()

Out[40]:

参数15:skiprows

跳过指定的行,可以是数字,列表,也可以是函数表达式

In [41]:

1
2
3
# pd.read_csv("Pandas_for_CSV.csv", skiprows=[0])
# pd.read_csv("Pandas_for_CSV.csv", skiprows=[0,1,2])
pd.read_csv("Pandas_for_CSV.csv", skiprows=lambda x: x % 2 == 0)

参数16:skip_blank_lines

是否跳过空白行。如果设置成True,则跳过空白行,否则不跳过,显示为NaN

参数17:skipfooter

最后的N行数据不进行显示

In [42]:

1
2
3
# pd.read_csv("Pandas_for_CSV.csv", skipfooter=1)  最后1行不显示
# pd.read_csv("Pandas_for_CSV.csv", skipfooter=2) 最后2行不显示
# pd.read_csv("Pandas_for_CSV.csv", skipfooter=3) 最后3行不显示

参数18:skipinitialspace

忽略分隔符后面的空白符

参数19:nrows

用来表示读取指定行数的数据

In [43]:

1
pd.read_csv("Pandas_for_CSV.csv",nrows=4)   # 读取4行数据

参数20:parse_dates

自动解析数据的时间信息

In [44]:

1
2
df = pd.read_csv("Pandas_for_CSV.csv")
df.dtypes

Out[44]:

1
2
3
4
5
6
7
8
9
id         object
name object
age int64
sex object
address object
time int64
year int64
month int64
dtype: object

In [45]:

1
2
3
4
df = pd.read_csv("Pandas_for_CSV.csv",
infer_datetime_format=True,
parse_dates=True)
df.dtypes

Out[45]:

1
2
3
4
5
6
7
8
9
id         object
name object
age int64
sex object
address object
time int64
year int64
month int64
dtype: object

In [46]:

1
2
3
4
df = pd.read_csv("Pandas_for_CSV.csv",
parse_dates=["time","year"] # 指定字段解析
)
df.dtypes

Out[46]:

1
2
3
4
5
6
7
8
9
id                 object
name object
age int64
sex object
address object
time datetime64[ns]
year datetime64[ns]
month int64
dtype: object

In [47]:

1
2
3
4
5
6
# 将6-year7-month合并成一个字段date

df = pd.read_csv("Pandas_for_CSV.csv",
parse_dates={"date":[6,7]}
)
df.dtypes

Out[47]:

1
2
3
4
5
6
7
8
date       datetime64[ns]
id object
name object
age int64
sex object
address object
time int64
dtype: object

参数21:keep_date_col

在上面的例子中生成了新的字段date,但是原来的year和mont删除了。可以通过keep_date_col来设置保留或者取出

In [48]:

1
2
3
4
5
6
7
# 将6-year和7-month合并成一个字段date

df = pd.read_csv("Pandas_for_CSV.csv",
parse_dates={"date":[6,7]},
keep_date_col=True # 保留原字段
)
df.dtypes

Out[48]:

1
2
3
4
5
6
7
8
9
10
date       datetime64[ns]
id object
name object
age int64
sex object
address object
time int64
year object
month object
dtype: object

保存CSV文件

这个保存到CSV的功能是将DataFrame保存到Excel的功能是类似的:

1
2
df.to_csv("new_df.csv")  # 会带上index索引号
df.to_csv("new_df.csv", index=False) # 不保留索引号

本文标题:Pandas读存CSV文件

发布时间:2022年05月10日 - 20:05

原始链接:http://www.renpeter.cn/2022/05/10/Pandas%E8%AF%BB%E5%AD%98CSV%E6%96%87%E4%BB%B6.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea