Pandas读入csv文件格式化

pd.read_csv( )

1
2
import pandas as pd
import numpy as np

pd.read_csv( filepath_or_buffer: 'FilePath | ReadCsvBuffer[bytes] | ReadCsvBuffer[str]', sep=<no_default>, delimiter=None, header='infer', names=<no_default>, index_col=None, usecols=None, squeeze=None, prefix=<no_default>, mangle_dupe_cols=True, dtype: 'DtypeArg | None' = None, engine: 'CSVEngine | None' = 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: 'CompressionOptions' = 'infer', thousands=None, decimal: 'str' = '.', lineterminator=None, quotechar='"', quoting=0, doublequote=True, escapechar=None, comment=None, encoding=None, encoding_errors: 'str | None' = '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: 'StorageOptions' = None, )

读取CSV

  • csv(逗号分割)
    也支持文件的部分导入和选择迭代

filepath_or_buffer

  • 指定文件路径
  • 本地文件 D:\OneDrive\文档\Office\shid.csv
  • url(http\ftp)
1
pd.read_csv('dlt.csv').head()

Output:

Unnamed: 0 期号 R1 R2 R3 R4 R5 B1 B2 日期
0 0 21088 2 14 31 34 35 1 7 2021-08-02
1 1 21087 10 14 15 25 28 3 10 2021-07-31
2 2 21086 2 3 7 16 17 6 10 2021-07-28
3 3 21085 1 12 15 26 35 10 11 2021-07-26
4 4 21084 2 10 14 30 33 6 9 2021-07-24

sep : str,指定分隔符

  • default ‘,’
  • 如果不指定参数,则会尝试使用逗号分隔。
  • 分隔符长于一个字符并且不是‘\s+’,将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:’\r\t’
1
pd.read_csv('dlt.csv',sep='\t').head()

Output:

,期号,R1,R2,R3,R4,R5,B1,B2,日期
0 0,21088,02,14,31,34,35,01,07,2021-08-02
1 1,21087,10,14,15,25,28,03,10,2021-07-31
2 2,21086,02,03,07,16,17,06,10,2021-07-28
3 3,21085,01,12,15,26,35,10,11,2021-07-26
4 4,21084,02,10,14,30,33,06,09,2021-07-24

index_col = None/0/False

  • 用第几列作为行索引
  • None :表示没有,自动添加数字序列作为索引
  • 0:指定第0列作为索引列
  • [0,1]: 也可以指定多列索引
1
pd.read_csv('dlt.csv', index_col=[0, 1]).head()

Output:

R1 R2 R3 R4 R5 B1 B2 日期
期号
0 21088 2 14 31 34 35 1 7 2021-08-02
1 21087 10 14 15 25 28 3 10 2021-07-31
2 21086 2 3 7 16 17 6 10 2021-07-28
3 21085 1 12 15 26 35 10 11 2021-07-26
4 21084 2 10 14 30 33 6 9 2021-07-24

header : int or list of ints

  • 指定数据框的列标签
  • default ‘infer’
  • None 会表明表中没有表头,自动添加数字序列的表头
  • 0 :表示使用表格中的首行作为标签
  • [0,1,2] 也可以是多行作为标题
  • 指定行数用来作为列名,数据开始行数。如果文件中没有列名,则默认为0,否则设置为None。
1
pd.read_csv('dlt.csv',index_col=0,header=None).head()

Output:

1 2 3 4 5 6 7 8 9
0
NaN 期号 R1 R2 R3 R4 R5 B1 B2 日期
0.0 21088 02 14 31 34 35 01 07 2021-08-02
1.0 21087 10 14 15 25 28 03 10 2021-07-31
2.0 21086 02 03 07 16 17 06 10 2021-07-28
3.0 21085 01 12 15 26 35 10 11 2021-07-26
1
pd.read_csv('dlt.csv', index_col=0, header=[0, 1, 2]).head()

Output:

期号 R1 R2 R3 R4 R5 B1 B2 日期
0 21088 02 14 31 34 35 01 07 2021-08-02
1 21087 10 14 15 25 28 03 10 2021-07-31
2 21086 2 3 7 16 17 6 10 2021-07-28
3 21085 1 12 15 26 35 10 11 2021-07-26
4 21084 2 10 14 30 33 6 9 2021-07-24
5 21083 7 9 11 26 35 1 8 2021-07-21
6 21082 1 14 22 29 33 3 10 2021-07-19

names= […] 更改列名称

  • 更改列名称
  • names=<no_default>
  • 数量要相同,
  • 列名称是一个序列
1
2
3
4
5
6
pd.read_csv(
'dlt.csv',
index_col=0,
header=0,
names=['期号', 'Red1', 'Red2', 'Red3', 'Red4', 'Red5', 'Blue1', 'Blue2',
'日期']).head()

Output:

期号 Red1 Red2 Red3 Red4 Red5 Blue1 Blue2 日期
0 21088 2 14 31 34 35 1 7 2021-08-02
1 21087 10 14 15 25 28 3 10 2021-07-31
2 21086 2 3 7 16 17 6 10 2021-07-28
3 21085 1 12 15 26 35 10 11 2021-07-26
4 21084 2 10 14 30 33 6 9 2021-07-24

usecols=None, 选取列

  • 要读入哪些列的数据,用列表表示
  • usecols=[0,1,...]
  • 当使用 usecols=[...] 参数时,要将 index_col =None
  • 也可以使用函数定义要读入哪些列,传入函数的变量是列标签
1
pd.read_csv('dlt.csv', index_col=None, header='infer', usecols=[1, 3, 5, 7, 9]).head()

Output:

期号 R2 R4 B1 日期
0 21088 14 34 1 2021-08-02
1 21087 14 25 3 2021-07-31
2 21086 3 16 6 2021-07-28
3 21085 12 26 10 2021-07-26
4 21084 10 30 6 2021-07-24
1
2
import  re
pd.read_csv('dlt.csv', index_col=None, header=0, usecols=lambda x: re.search("^B",x)).head()

Output:

B1 B2
0 1 7
1 3 10
2 6 10
3 10 11
4 6 9

dtype : 指定列的数据格式

  • default None
  • 用字典的格式指定多列
  • 每列数据的数据类型。例如 {‘a’: np.float64, ‘b’: np.int32}
  • dtype = {col1’: str ,’col2’: int32 ,’col3’ :
1
2
3
4
5
6
7
8
9
10
11
df1 = pd.read_csv('dlt.csv', index_col=0, header=[0])

df2 = pd.read_csv('dlt.csv',
index_col=0,
header=0,
dtype={
'期号': str,
'R2': int,
})
print('之前各列的数据格式:\n', df1.dtypes)
print('指定了dtype参数后各列的数据格式:\n', df2.dtypes)

Output:
<img src="./1.webp">

parse_dates 解析日期列

  • parse_dates=['col_date']
  • 指定某些列为时间类型,这个参数一般搭配date_parser使用。
    • date_parser:是用来配合parse_dates参数的,
    • 因为有的列虽然是日期,但没办法直接转化,需要我们指定一个解析格式:
1
2
3
4
5
6
7
8
9
10
11
df2 = pd.read_csv('dlt.csv',
index_col=0,
header=0,
dtype={
'期号': str,
'R2': np.int32,
},
parse_dates=['日期'])

print('之前各列的数据格式:\n', df1.dtypes)
print('指定了dtype参数后各列的数据格式:\n', df2.dtypes)

Output:
<img src="./2.webp">

converters : dict

  • default None 列转换函数的字典。key可以是列名或者列的序号。
  • 可以转换数据格式,也可以使用函数运算
1
2
3
4
5
6
7
8
9
10
11
12
pd.read_csv('dlt.csv',
index_col=0,
header=0,
dtype={
'期号': str,
'Red2': int,
},
parse_dates=['日期'],
converters={
'R5': float,
'R1': lambda x: str(x).rjust(3, "0")
}).head()

Output:

期号 R1 R2 R3 R4 R5 B1 B2 日期
0 21088 002 14 31 34 35.0 1 7 2021-08-02
1 21087 010 14 15 25 28.0 3 10 2021-07-31
2 21086 002 3 7 16 17.0 6 10 2021-07-28
3 21085 001 12 15 26 35.0 10 11 2021-07-26
4 21084 002 10 14 30 33.0 6 9 2021-07-24

nrows : int

  • default None
  • 需要读取的行数(从文件头开始算起)。
1
2
3
4
5
6
7
8
9
10
11
12
13
pd.read_csv('dlt.csv',
index_col=0,
header=0,
dtype={
'期号': str,
'Red2': int,
},
parse_dates=['日期'],
converters={
'R5': float,
'R1': lambda x: str(x).rjust(3, "0")
},
nrows=8)

Output:

期号 R1 R2 R3 R4 R5 B1 B2 日期
0 21088 002 14 31 34 35.0 1 7 2021-08-02
1 21087 010 14 15 25 28.0 3 10 2021-07-31
2 21086 002 3 7 16 17.0 6 10 2021-07-28
3 21085 001 12 15 26 35.0 10 11 2021-07-26
4 21084 002 10 14 30 33.0 6 9 2021-07-24
5 21083 007 9 11 26 35.0 1 8 2021-07-21
6 21082 001 14 22 29 33.0 3 10 2021-07-19
7 21081 005 13 24 29 35.0 7 8 2021-07-17

skip_blank_lines : 对空行的处理

  • boolean, default True
  • 如果为True,则跳过空行;否则记为NaN。

skiprows : list-like or integer

  • default None 需要忽略的行数(从文件开始处算起),或需要跳过的行号列表(从0开始)。
  • 注意不要将表头给过滤掉
  • skipfooter : int, default 0 从文件尾部开始忽略。 (c引擎不支持)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
pd.read_csv('dlt.csv',
index_col=0,
header=0,
dtype={
'期号': str,
'Red2': int,
},
parse_dates=['日期'],
converters={
'R5': float,
'R1': lambda x: str(x).rjust(3, "0")
},
nrows=8,
skiprows=lambda x: x > 0 and x % 2 == 0)

Output:

期号 R1 R2 R3 R4 R5 B1 B2 日期
0 21088 002 14 31 34 35.0 1 7 2021-08-02
2 21086 002 3 7 16 17.0 6 10 2021-07-28
4 21084 002 10 14 30 33.0 6 9 2021-07-24
6 21082 001 14 22 29 33.0 3 10 2021-07-19
8 21080 015 16 20 29 30.0 6 10 2021-07-14
10 21078 002 8 17 19 25.0 1 5 2021-07-10
12 21076 006 13 22 25 26.0 2 4 2021-07-05
14 21074 011 14 18 20 25.0 3 7 2021-06-30

engine : 指定解析数据的引擎

  • {‘c’, ‘python’} 两种选择
  • 使用的分析引擎。可以选择C或者是python。C引擎快但是Python引擎功能更加完备。

encoding : 指定字符集类型

  • gbk,ansi,utf-8-sig,
  • 通常指定为’utf-8’.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pd.read_csv('dlt.csv',
index_col=0,
header=0,
dtype={
'期号': str,
'R2': float,
},
parse_dates=['日期'],
converters={
'R5': float,
'R1': lambda x: str(x).rjust(2, "0")
},
nrows=8,
skiprows=lambda x: x > 0 and x % 2 == 0,
encoding='utf-8-sig',
engine='c')

Output:

期号 R1 R2 R3 R4 R5 B1 B2 日期
0 21088 02 14.0 31 34 35.0 1 7 2021-08-02
2 21086 02 3.0 7 16 17.0 6 10 2021-07-28
4 21084 02 10.0 14 30 33.0 6 9 2021-07-24
6 21082 01 14.0 22 29 33.0 3 10 2021-07-19
8 21080 15 16.0 20 29 30.0 6 10 2021-07-14
10 21078 02 8.0 17 19 25.0 1 5 2021-07-10
12 21076 06 13.0 22 25 26.0 2 4 2021-07-05
14 21074 11 14.0 18 20 25.0 3 7 2021-06-30