Pandas读取CSV和普通文本数据文件

目录

5 行标签的处理

6 读取特定的列

7. 跳过某些行¶

8. 分隔符不一定是逗号

9. read_csv()与read_table()的差异

本文简单Pandas读取csv数据文件以及普通文本型数据文件所需要的各种基本操作。

本文中的代码假定在Jupyter Notebook中运行,且假定已经导入了pandas包。

import pandas as pd

缺省配置下,pandas会自动地将第一行作为header处理,从中提取出列标签。后面可以根据这个列的名称来访问对应的列。 缺省配置下,pandas自动为除header以外的各行赋予一个行号,可以用这个行号来访问某一行。

示例文件:param.csv

Pandas读取CSV和普通文本数据文件

df的数据类型为Pandas.DataFrame,示例如下:

df = pd.read_csv("param.csv")
df

Pandas读取CSV和普通文本数据文件

需要注意的是,在Jupyter-Notebook中,缺省地会将最后一行的运行结果打印出来。针对Pandas.DataFrame,直接输入变量让它打印的效果要比显式地用print()打印要漂亮得多,显式地调用print(df)的效果如下所示显然非常ugly.

print(type(df), df.shape) # 查看df的类型和形状
print(df)

Pandas读取CSV和普通文本数据文件

访问df的行和列,可以用列标签和行标签。注意列访问直接用df[]即可,行访问需要使用loc[]或者iloc[]。loc[]接收字符串形式的行标签,而iloc接收整数行号作为输入。

print(df['params']) # 访问params对应列
print(df.iloc[0]) # 访问params对应行

Pandas读取CSV和普通文本数据文件

有时候,用于识别列的列标签(即header)并不是放在数据文件的第一行,这个时候可以通过header参数来指定pandas从数据文件的哪一行来推断列标签. 以下例子中pandas把第2行识别为header了,而且把第1行给跳过去了,也就是说pandas只读取header以下的行。

注意,header设置为0与缺省设定效果相同

df = pd.read_csv("param.csv", header = 1)
df

Pandas读取CSV和普通文本数据文件

当数据文件没有标签行(即没有header)时,如果仍用缺省配置进行读取的话,pandas会自动地将第一行识别为header,但是这显然不是所想要的结果。

示例文件:param_without_header.csv

Pandas读取CSV和普通文本数据文件
df = pd.read_csv("param_without_header.csv")
df

这个读取出来的效果跟上一个例子相同,但是其原因是不同的。

此时应该指定header参数为None,告诉pandas不要把第一行识别为header.这样pandas会缺省地为每一列赋一个数字作为列标签,可以通过该标签访问列。

df = pd.read_csv("param_without_header.csv", header=None)
df

Pandas读取CSV和普通文本数据文件

对于没有header的csv文件,也可以在读入时给每一列赋以明确的有物理含义的标签名.可以通过name参数指定,所使用的标签名可以为一个字符串列表

df = pd.read_csv("param_without_header.csv", header=None,  names=["params", "case1", "case2", "case3", "case4"])
df

Pandas读取CSV和普通文本数据文件

5 行标签的处理

上面说了缺省条件下,pandas自动为每一行加一个数字行号。但是如果原文件有表示行标签的一列的话,可以通过参数指定告诉pandas从中提取行标签而不是赋予缺省值。与header设置相同的是,index_col也并不限定于0,而是可以指定任意一列,虽然一般情况下不会需要这样使用

df = pd.read_csv("param.csv", index_col=0)
df

Pandas读取CSV和普通文本数据文件

注意params这一列的位置的变化,由于index_col指定为0,pandas自动将第一列(列号为0的这一列,因为python是0-indexing)作为行标签处理,从中提取行标签。后续可以利用这个字符串形式的行标签来访问行。但是要注意的是,不是df[‘cn_start’]而是df.loc[‘cn_start’]。当然仍然可以利用df.iloc[k]的方式来访问。注意loc[]与iloc[]的区别,一个是根据行标签进行访问,一个是根据行号来访问。

print(df.loc['cn_start'])
print(df.iloc[0])

Pandas读取CSV和普通文本数据文件

6 读取特定的列

当数据文件非常大,而只需要使用其中很小的一部分的时候,全部读进来然后再从中选取某些列使用当然可以,但是内存使用效率就太低了。这时可以通过usecols参数来指定读取指定的某些列。usecols可以以整数列表的方式指定,也可以以列表前字符串列表的方式指定。

df = pd.read_csv("param.csv", usecols=['hplc_band0_ext06_0Hz_dpllon'])
df

Pandas读取CSV和普通文本数据文件
df = pd.read_csv("param_without_header.csv", usecols=[1])
df

Pandas读取CSV和普通文本数据文件
  1. 跳过某些行

前面说过当将header指定为大于0的值时,会将header之前的行跳过。这种使用方法可以用来在文件中的确有header行时跳过header前面的行。但是实际情况中可能需要的是跳过中间若干行,而且甚至是不连续的若干行,这个时候可以通过skiprows参数来指定跳过哪些行,skiprows以整数列表的方式指定。

以下示例中跳过了第3行和第5行。

df = pd.read_csv("param.csv", skiprows=[2,4])
df

Pandas读取CSV和普通文本数据文件
  1. 分隔符不一定是逗号

有些普通的txt文件,它不是使用逗号而是使用别的分隔符来分割数据项,也可以使用read_csv()来读取。

读取普通的txt文件与读取csv文件大同小异。因为csv文件本来就是普通的txt文件的一种特殊形式而已。用文本编辑器打开csv文件可以看出,它的特殊之处无非就是用逗号”,”作为每一数据项之间的分隔符而已。 read_csv()有一个参数sep用于指定分隔符,只不过sep的缺省值就是逗号,因此读取csv文件时就不需要明确指定了。 如果txt文件中用空格表示数据项之间的分隔符的话,那用read_csv()读取时将分隔符sep设置为空格就可以了。

示例数据文件:data_with_header.dat

Pandas读取CSV和普通文本数据文件
df = pd.read_csv("data_with_header.dat", sep=" ")
df

Pandas读取CSV和普通文本数据文件

但是如果数据项之间的多出来额外的空格符的话,就会导致pandas识别错误。如下例。由于pandas认为每个空格分割出一列,现在数据文件本身原始两列之间有两个空格,所以pandas识别为三列。

示例数据文件:data_with_header_with_extra_spaces

Pandas读取CSV和普通文本数据文件
df = pd.read_csv("data_with_header_with_extra_spaces.dat", sep=" ")
df

Pandas读取CSV和普通文本数据文件

解决办法为将sep设置为sep=”\s+”.这是一个正则表达式,s表示空格,+号则表示一个或多个。

df = pd.read_csv("data_with_header_with_extra_spaces.dat", sep="\s+")
df

Pandas读取CSV和普通文本数据文件

再看一个用下划线”_”作为分隔符的例子。

示例数据文件:data_with_underscore_as_sep

df = pd.read_csv("data_with_underscore_as_sep.dat", header=None, names=['UTC', 'Power'], sep="_")
df

Pandas读取CSV和普通文本数据文件
  1. read_csv()与read_table()的差异

Pandas中还有一个与read_csv()相进的函数:read_table()。它们之间的唯一差别就是sep参数的缺省值不同而已,read_csv()缺省模式用于读取csv文件,因此其sep参数的缺省值为逗号”,”,而read_table()是用于读取以制表符”\t”为分隔符的表格类型的数据,所以其缺省值为逗号”\t”。

仅此而已。所以如果你总是明确地指定sep参数值的话,那这两个函数就是完全相同的,事实上它们肯定是调用相同的内核,它们只是同一内核的两张不同的外衣罢了。

关于更多的pandas.read_csv()各种妖娆用法可以参考pandas说明文档:

Ref: pandas.read_csv — pandas 1.3.4 documentation

Pandas读取CSV和普通文本数据文件

Original: https://blog.csdn.net/chenxy_bwave/article/details/121176698
Author: 笨牛慢耕
Title: Pandas读取CSV和普通文本数据文件

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/742761/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球