当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python Pandas read_csv方法用法及代码示例


Pandas 的 read_csv(~) 方法读取文件,并将其内容解析为 DataFrame。

这头猛犸象有 40 多个参数,但只需要一个。

参数

1.filepath_or_buffer | stringpath objectfile-like object

您要读取的文件的路径。

2. sep | string | optional

分隔数据的分隔符。如果设置为 None ,并且您正在使用 Python 解析引擎(请参阅下面的 engine 参数),则该方法将尝试从文件中推断分隔符。默认情况下,sep=","

3. header | intlist<int> | optional

代表标题的行号。如果传递列表,则生成的DataFrame将是多索引的。默认情况下, head=0 ,这意味着第一行将被视为列标签。请注意, header 不考虑注释和空行(当 skip_blank_lines=True 时),因此 head=0 不一定是文件的第一行。

4. names | array-like<string> | optional

要使用的列标签。重复的标签将导致错误。

注意

假设您的文件包含标题行(即列标签),但您希望使用其他一些列标签。您可以通过显式设置 header=0 ,然后指定 names 参数来完成此操作。

5. index_col | intstringsequence<int> | optional

文件中的整数索引或列标签,用作生成的 DataFrame 的行标签。默认情况下,index_col=None

6. usecols | array-like<int>array-like<string>function | optional

要包含在生成的 DataFrame 中的整数索引或列标签。如果提供了函数,则该函数接受列标签作为参数,并返回一个布尔值,指示是否包含该列。

默认情况下,包含所有列。

7. squeeze | boolean | optional

如果生成的 DataFrame 仅包含单个列,是否返回 Series。默认情况下,squeeze=False

8. prefix | string | optional

如果未提供 header,则附加到列名称的前缀。例如, prefix="A" 意味着列标签可能是 "A0""A1" 等。默认情况下不添加前缀。

9. mangle_dupe_cols | boolean | optional

是否将数字后缀附加到具有重复标签的列。默认情况下, mangle_dupe_cols=True ,这意味着当列标签冲突时不会覆盖,而是将后缀附加到列标签上。例如,如果有 2 个列标签 "A""A" ,则第二个将称为 "A.1"

警告

显然,mangle_dupe_cols=False 尚未得到支持,尽管这没有正式记录。

10.dtype | stringtypedict<string, string||type> | optional

用于列的数据类型。如果提供了 dict,则 key 将是列标签,value 将是其所需的类型。

11.engine | string | optional

是否使用C或Python解析引擎。允许的值为 "c""python"

与 Python 对应的引擎相比,C 解析引擎速度更快,但函数较少。例如,Python 解析引擎将能够自动从文件中推断出分隔符,而 C 解析引擎则不能。

12.converters | dict<string, function> | optional

将应用于列的函数。键是要应用函数的列的标签。默认情况下,不应用任何函数。

13.true_values | list | optional

将在生成的 DataFrame 中评估为 True 的值列表。

14.false_values | list | optional

将在生成的 DataFrame 中评估为 False 的值列表。

15.skipinitialspace | boolean | optional

官方文档声称该参数指定是否跳过分隔符后面的空格。但是,我们广泛测试了此参数,发现无论您在此处设置什么,值的所有前导和尾随空格(包括列和行标签)都会被删除。如果您有什么见解,欢迎与我们交流!默认情况下,skipinitialspace=False

16.skiprows | list-likeintfunction | optional

要跳过的行号(以整数索引表示)。例如,skiprows=1 将跳过文件中的第二行。如果提供了函数,则该函数接受行标签作为参数,并返回一个布尔值,指示是否跳过该行。

17.skipfooter | int | optional

从底部开始忽略的行数。这仅在 engine="python" 时实现。默认情况下,skipfooter=0

18.nrows | int | optional

要包含的行数。这不包括列标签的行。默认情况下,包含所有行。

19.na_value | scalarstringlist-likedict | optional

将被解释为 NaN 的附加值。如果提供了dict,则关键是要考虑的列的标签。

默认情况下,以下所有值都被解释为 na

'', '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN',
'-NaN', '-nan', '1.#IND', '1.#QNAN', '', 'N/A',
'NA', 'NULL', 'NaN', 'n/a', 'nan', 'null'

20.keep_default_na | boolean | optional

是否保留默认的 na 值。该行为取决于您是否指定了 na_value 参数:

指定na_value

na_value 未指定

keep_deafault_na=True

除了默认的 na 值之外,还将使用您指定的 na_values

将使用默认的 na 值。

keep_default_na=False

您指定的 na_values 将替换默认的 na 值。

没有数据将被视为 na 值。

默认情况下,keep_default_na=True

21.na_filter | boolean | optional

是否检查 na 值。如果设置为 False ,则 na_valuekeep_default_na 将被忽略,因此像 "NaN" 这样的值将被视为字符串 - "NaN" 而不是 NaN 。如果您确定您的文件不包含任何 na 值,则设置为 False,因为这将提高性能。默认情况下,na_filter=True

22.verbose | boolean | optional

是否在屏幕上打印以下指标:

Tokenization took: ~ ms
Type conversion took: ~ ms
Parser memory cleanup took: ~ ms

默认情况下,verbose=False

23.skip_blank_lines | boolean | optional

是否跳过空白行(例如仅包含制表符和空格的行)而不是将它们视为 na 值。默认情况下,skip_blank_lines=True

24.parse_dates | boolean | optional

解析日期的规则。允许的值如下:

说明

True

将索引解析为日期。所有其他列将被解释为非日期类型。

False

不要将任何内容解析为日期。

list<int or string>

要解析为日期的列的整数索引或标签。

例如,传递 ["A","C"] 将分别将列 "A""C" 解析为日期。

list<list<int or string>>

要组合以解析为单个日期的列。

例如,传递 [["A","C"]] 意味着列 AC 的组合将被解析为单个日期。

dict

列标签(键)和要组合以解析为日期的列。例如,传递 {"A":[1,5]} 会将索引 15 处的组合列解析为日期,以在生成的 DataFrame 中形成列 "A"

默认情况下,parse_dates=False

如果某个值无法正确解析为日期,则该值的列将改为 object 类型。

25.infer_datetime_format | boolean | optional

如果设置为 Trueparse_dates!=False ,则将推断日期的格式。推断的格式经过深度优化,可能会带来 5-10 倍的加速。默认情况下,infer_datetime_format=False

26.keep_date_col | boolean | optional

是否在生成的 DataFrame 中保留原始日期。仅当指定的 parse_dates 涉及组合多个列时,此参数才相关。默认情况下,keep_date_col=False

27.date_parser | function | optional

该函数用于将字符串转换为日期。使用以下不同的参数可以调用该函数最多 3 次:

(我)。一个或多个日期字符串数组,对应于您根据 parse_dates 组合的列。

(二).包含连接日期字符串的单个数组,具体取决于您选择的 parse_dates

(三)。与您根据 parse_dates 组合的列相对应的一个或多个日期字符串。每行都会调用此方法。

每当异常发生时,就会调用后续的函数。例如,如果 (i) 失败,那么接下来将调用 (ii)。默认情况下,使用dateutil.parser.parser

28.dayfirst | bool | optional

是否将日期放在前面(例如 DD/MM)。默认情况下,dayfirst=False

29.cache_dates | boolean | optional

是否保留执行的日期转换的缓存。当您尝试转换重复的日期时,您可以使用缓存来节省一些计算,而不是多次执行相同的转换。默认情况下,cache_dates=True

30.iterator | boolean | optional

是否返回可用于分块读取数据的 Iterator。默认情况下,iterator=False

31.chunksize | int | optional

一次读取的行数。如果指定,则将返回用于迭代行的 TextFileReader 对象。默认情况下,所有行都作为一个大块读取。

32.compression | string | optional

文件的压缩格式。允许的值为:

"gzip", "bz2", "zip" and "xz"

默认情况下,compression="infer"

33.thousands | string | optional

表示每千位数字的字符。例如,传递 "," 将使 10000 等值成为 10,000 。默认情况下,thousands=None

34.decimal | string | optional

表示小数点的字符。默认情况下,decimal="." 。该参数的存在是因为法国等一些欧洲国家使用 , 来表示小数点。

35.lineterminator | char | optional

用于指示换行符的字符。仅当 engine="c" 时支持此函数。

36.quotechar | string 长度为 1 | optional

当一个值恰好包含分隔符时,该值将被错误地分割。您可以使用 quotechar 包装您的值,以防止发生此类不必要的拆分。例如,如果 sep="," ,并且我们设置了 quotechar="@" ,则值 @alex,bob@ 将被视为整个 alex,bob,而不是 alexbob 两个单独的值。默认为 "

37.quoting | intcsv.QUOTE_* | optional

使用的引用规则 - 允许的值如下:

  • QUOTE_MINIMAL ,

  • QUOTE_ALL ,

  • QUOTE_NONNUMERIC ,

  • QUOTE_NONE

默认情况下,quoting=csv.QUOTE_MINIMAL

38.doublequote | boolean | optional

是否解析 quotechar 。默认情况下,doublequote=True

39.escapechar | string | optional

用于转义双引号的字符。默认情况下,escapechar=None

40.comment | string | optional

如果您的输入文件包含注释,那么您可以指定标识注释的内容。例如,设置为"#" 将意味着同一行中#后面的字符将被视为注释。传递的值必须是单个字符。

默认情况下,comments=None

41.encoding | string | optional

读取文件时使用的编码(例如 "latin-1""iso-8859-1" )。默认情况下,encoding="utf-8"

42.error_bad_lines | boolean | optional

当无法正确解析行时是否抛出错误。例如,如果您的行包含 6 个值,而您只有 4 列,则会引发错误。如果设置为True,则会引发错误并且不会返回DataFrame。如果设置为 False ,则无法解析的行将被忽略。默认情况下,error_bad_lines=True

43.warn_bad_lines | boolean | optional

当无法正确解析行时是否输出警告。默认情况下,warn_bad_lines=True

44.delim_whitespace | boolean | optional

是否将空格设置为分隔符。如果设置了此项,则不应指定 sep 参数。默认情况下,delim_whitespace=False

45.low_memory | boolean | optional

是否在内部分块处理文件。如果设置为 True ,则列的结果类型可能会变得不太准确。为了确保不会发生这种情况,请使用 dtype 参数显式指定数据类型。默认情况下,low_memory=False

注意

无论 low_memory 设置的值如何,生成的 DataFrame 都将相同。文件在内部仅以块的形式进行解析,以便在读取过程中节省内存。如前所述,在某些小情况下,数据类型可能会有所不同。

46.memory_map | boolean | optional

如果是 True ,那么要读取的文件将首先复制到内存并从那里读取。由于没有 I/O 开销,因此可以显著提高性能。默认情况下,memory_map=False

47.float_precision | string | optional

用于浮点数的转换器。可用选项如下:

  • None 用于标准转换器

  • "high" 用于 high-precision 转换器

  • "round_trip" 用于 round-trip 转换器。

这仅与 engine="C" 相关。默认情况下,float_precision=None

返回值

如果设置了 chunksize,则返回 TextFileReader 对象。否则,将返回包含导入数据的DataFrame

例子

基本用法

假设我们有以下名为 sample.txt 的文本文件,其中包含一些逗号分隔的数据:

A,B,C
3,4,5
6,7,8

将此文件作为 DataFrame 读取:

df = pd.read_csv("sample.txt")
df



   A  B  C
0  3  4  5
1  6  7  8

确保文本文件与 Python 脚本位于同一目录中。

指定标题

假设我们的sample.txt文件如下:

# I am a comment
A,B,C
3,4,5
6,7,8

这里,文件的第一行是空的,第二行是注释。

默认情况下, header=0 ,这意味着第一个有效行(非注释和非空行)将被视为列标签:

df = pd.read_csv("sample.txt", comment="#")      # header=0
df



   A  B  C
0  3  4  5
1  6  7  8

一个常见的错误是将 header=0 解释为文件的第一行。正如示例中所示,这不一定是正确的,因为 header 会忽略以下行:

  • skip_blank_lines=True 时为空白(默认)

  • 注释(如 comment 参数所示)。

指定列标签

假设我们的sample.txt文件如下:

3,4,5
6,7,8

请注意该文件不包含任何标头。

要提供列标签,请设置 names 参数,如下所示:

df = pd.read_csv("sample.txt", names=["A","B","C"])
df



   A  B  C
0  3  4  5
1  6  7  8

覆盖标题

假设我们的sample.txt文件如下:

A,B,C
3,4,5
6,7,8

请注意该文件如何包含标题行。

要覆盖标题行,请设置 header=0names

df = pd.read_csv("sample.txt", header=0, names=["D","E","F"])
df



   D  E  F
0  3  4  5
1  6  7  8

指定index_col

假设我们的sample.txt如下:

A,B,C
a,3,4,5
b,6,7,8

由于从第二行开始有 4 个值(而不是 3 个),read_csv(~) 将自动将第一列视为索引:

df = pd.read_csv("sample.txt")
df



   A  B  C
a  3  4  5
b  6  7  8

现在,考虑一个以 , 开头的文件,如下所示:

,A,B,C
a,3,4,5
b,6,7,8

由于每行包含相同数量的 , ,因此该方法不会将第一列视为值的一部分。为了确保第一列被视为索引,请像这样传递index_col=0

df = pd.read_csv("sample.txt", index_col=0)
df



   A  B  C
a  3  4  5
b  6  7  8

指定 usecols

默认情况下,所有列都作为 DataFrame 读取和解析。您可以通过指定 usecols 参数来选择要包含的列。

考虑以下 sample.txt 文件:

A,B,C
3,4,5
6,7,8

仅读取AC 列:

df = pd.read_csv("sample.txt", usecols=["A","C"])
df



   A	C
0  3	5
1  6	8

您还可以传入 usecols 的函数,该函数接受列的标签作为参数,并返回一个布尔值,指示是否包含该列。

例如,仅包含带有标签 "B" 的列:

df = pd.read_csv("sample.txt", usecols=lambda x: x == "B")
df



   B
0  4
1  7

对于那些不熟悉 Python 中的 lambda 表达式的人来说,这相当于以下内容:

def foo(col_label):            # the name of the function is irrelevant. 
 return col_label == "B"
df = pd.read_csv("sample.txt", usecols=foo)
df



   B
0  4
1  7

指定mangle_dupe_cols

当列标签冲突时,后一列不会覆盖前一列 - 相反,mangle_dupe_cols=True 的默认行为是向后一列附加后缀。

考虑以下 sample.txt 文件:

A,B,A
3,4,5
6,7,8

使用默认参数读取此文件会产生:

df = pd.read_csv("sample.txt")
df



   A  B  A.1
0  3  4   5
1  6  7   8

尽管没有正式记录,但尚不支持 mangle_dupe_cols=False ,它应该允许重复标签。

指定数据类型

考虑以下 sample.txt 文件:

A,B
3,4
5,6

默认情况下,将从数据推断列类型:

df = pd.read_csv("sample.txt")
df.dtypes



A    int64
B    int64
dtype: object

设置所有列的类型:

df = pd.read_csv("sample.txt", dtype=float)
df.dtypes



A    float64
B    float64
dtype: object

要单独设置列的类型:

df = pd.read_csv("sample.txt", dtype={"A":float, "B":str})
df.dtypes



A    float64
B     object
dtype: object

指定转换器

Converters 参数非常有用,因为它允许我们对列值应用映射。

考虑以下 sample.txt 文件:

A,B,C
3,4,5
6,7,8

我们可以像这样转换特定列的值:

df = pd.read_csv("sample.txt", converters={"A": lambda x : int(x)+10, "C": lambda x : int(x) > 6})
df



   A   B  C
0  13  4  False
1  16  7  True

函数的参数是 string 类型的列值,这意味着我们必须首先将其转换为数值类型才能执行算术。

指定true_values和false_values

考虑以下 sample.txt 文件:

A,B,C
a,b,c
d,e,f

要将值 "a" 映射到 True 并将 "d" 映射到 False

df = pd.read_csv("sample.txt", true_values=["a"], false_values=["d"])
df



   A      B  C
0  True   b  c
1  False  e  f

请注意,只有像我们上面那样将整个列映射到布尔值时,映射才有效。例如,以下内容将无法按预期工作:

df = pd.read_csv("sample.txt", true_values=["a"], false_values=["f"])
df



   A  B  C
0  a  b  c
1  d  e  f

指定跳行

skiprows 参数是要跳过的行号(以整数索引表示)。它接受单个整数、整数序列或函数。由于前两者是不言自明的,我们将演示如何传递函数。该函数接受行标签作为参数,并输出一个布尔值,指示是否跳过该行。

考虑以下 sample.txt 文件:

A,B,C
3,4,5
6,7,8

要跳过第二行(具有整数索引 1 的行):

df = pd.read_csv("sample.txt", skiprows= lambda x : x == 1)
df



   A  B  C
0  6  7  8

指定na_filter

考虑以下 sample.txt 文件:

A,B,C
3,4,nan
6,NaN,8

这里的问题是是否将 nanNaN 视为字符串或实际缺失值(即 nan )。默认情况下, na_filter=True ,这意味着它们将被视为 nan

df = pd.read_csv("sample.txt")   # na_filter=True
df



   A  B    C
0  3  4.0  NaN
1  6  NaN  8.0

应该清楚的是,我们现在有了实际的 nan 值,但我们可以使用检查 nan 值的 df.isnull() 方法来确认这一点:

df.isnull()



   A      B      C
0  False  False  True
1  False  True   False

要将 nanNaN 视为字符串,请像这样设置 na_filter=False

df = pd.read_csv("sample.txt", na_filter=False)
df



   A  B    C
0  3  4    nan
1  6  NaN  8

然后我们再次调用 df.isnull() 来检查实际缺失值(nan):

df.isnull()



   A      B      C
0  False  False  False
1  False  False  False

我们看到这些值都是False,这意味着它们被解释为字符串。

指定日期

将索引解析为日期

考虑以下sample.txt 文件:

name,gender
1995,alice,female
2005/12,bob,male

这里,索引(行标签)将被解析为日期。为此,请设置parse_date=True

df = pd.read_csv("sample.txt", parse_dates=True)
df



            name   gender
1995-01-01  alice  female
2005-12-01  bob    male

默认日期格式为 YYYY-MM-DD ,未指定的日期和月份将用 01 填充,如输出中所示。

将非索引列解析为日期

考虑以下 sample.txt 文件:

name,admitted,graduated
alice,2014,2018
bob,2016,2020

正如我们之前所做的那样,设置 parse_date=True 意味着只有索引将被解析为日期。这对于该文件来说是不可取的,因为要解析的日期是非索引列。

要将 admittedgraduated 列解析为日期:

df = pd.read_csv("sample.txt", parse_dates=["admitted","graduated"])
df



   name   admitted    graduated
0  alice  2014-01-01  2018-01-01
1  bob    2016-01-01  2020-01-01

要确认我们列的数据类型:

df.dtypes



name                 object
admitted     datetime64[ns]
graduated    datetime64[ns]
dtype: object
组合多个日期列

考虑以下 sample.txt 文件:

Year,Month
2020,12
1994,02

在这里,我们有 2 个独立的列,我们希望将它们解析为单个日期列。我们可以通过传入嵌套列表来做到这一点,如下所示:

df = pd.read_csv("sample.txt", parse_dates=[["Year","Month"]])
df



   Year_Month
0  2020-12-01
1  1994-02-01

我们还可以通过传入 dict 来组合日期,如下所示:

df = pd.read_csv("sample.txt", parse_dates={"A":["Year","Month"]})
df



   A
0  2020-12-01
1  1994-02-01

使用 dict 而不是嵌套列表的优点是您可以为组合列提供标签(在本例中为 A)。

指定date_parser

考虑以下 sample.txt 文件:

Year,Month
2020,12
1994,02

date_parser 参数允许您指定如何解析日期字符串。

例如,要应用一年的偏移量:

import dateutil
from dateutil.relativedelta import relativedelta
def my_date_parser(*arg):
    date_time = datetime.strptime(arg[0], "%Y %m")
 return date_time + relativedelta(years=1)
df = pd.read_csv("sample.txt", parse_dates={"A":["Year","Month"]}, date_parser=my_date_parser)
df



   A
0  2021-12-01
1  1995-02-01

由于 date_parser 函数最多可以使用不同的参数调用 3 次,因此我们使用可变参数的语法 *args

为了分解 date_parser 的工作原理,假设我们打印出 arg 是什么:

def my_date_parser(*arg):
 print(arg)
    date_time = datetime.strptime(arg[0], "%Y %m")
 return date_time + relativedelta(years=1)



(array(['2020', '1994'], dtype=object), array(['12', '02'], dtype=object))
('2020 12',)
('1994 02',)
  • 第一次调用 my_date_parser 时,将返回 2 个 Series ,每个都包含要组合的日期字符串。由于 datetime.striptime 函数接受字符串而不是系列,因此该函数实际上会引发错误。

  • 但是,并没有终止程序,而是再次调用 my_date_parser - 这次传递的参数是单个日期字符串 ( '2020 12' )。 striptime可以正确解析,所以这次解析成功。

指定迭代器

考虑以下 sample.txt 文件:

A,B
1,2
3,4
5,6
7,8
9,10

通过设置 iterator=True ,该方法返回 TextFileReader 。当您想要像这样分块读取文件时,这非常有用:

reader = pd.read_csv("sample.txt", iterator=True)
print(reader.get_chunk(2))
print("-----")
print(reader.get_chunk(3))



   A  B
0  1  2
1  3  4
-----
   A   B
2  5   6
3  7   8
4  9  10

这里get_chunk(n)返回带有n行的DataFrame。除非您需要读取不同大小的块,否则请选择使用chunksize

指定块大小

考虑以下 sample.txt 文件:

A,B
1,2
3,4
5,6
7,8
9,10

要分块读取此文件,请设置chunksize,如下所示:

for chunk in pd.read_csv("sample.txt", chunksize=2):
 print(chunk)
 print("-----")



   A  B
0  1  2
1  3  4
-----
   A  B
2  5  6
3  7  8
-----
   A   B
4  9  10
-----

在这里,每个 chunk 都是 DataFrame 类型。

注意

处理无法放入内存的大数据时,请考虑使用 iteratorchunksize

指定千

考虑以下 sample.txt 文件:

A B
3,000 6,000,000

这里,我们的数据使用,来表示每千。

默认情况下,这些值将被视为字符串:

df = pd.read_csv("sample.txt", sep=" ")
df



   A      B
0  3,000  6,000,000

要将值视为数字,请像这样设置thousands

df = pd.read_csv("sample.txt", sep=" ", thousands=",")
df



   A     B
0  3000  6000000

指定引号字符

当值包含令人困惑的分隔符时,quotechar 会派上用场。

考虑以下 sample.txt 文件:

A,B
3,4,5
6,7

在这里,请注意第二行包含 3 个值,而其他行仅包含 2 个值。在这种情况下调用read_csv(~)将导致错误。

如果您想将 3,4 视为单个值而不是两个单独的值,则可以将它们括在引号中。默认情况下 quotechar=" ,这意味着我们可以像这样否定分隔符:

A,B
"3,4",5
6,7

现在,调用 read_csv(~) 会产生:

df = pd.read_csv("sample.txt")
df



   A    B
0  3,4  5
1  6    7

请注意3,4 现在如何解释为单个条目。

指定转义字符

考虑以下sample.txt

A,B
"3\"4",5
6,7

这里,内部 " 使用转义字符 "\" 进行转义。这表明我们希望将 3"4 读取为该条目的值,但错误地调用 read_csv(~) 会产生以下结果:

df = pd.read_csv("sample.txt")
df



   A     B
0  3\4"  5
1  6     7

发生这种情况是因为 Pandas 无法将 "\" 识别为转义字符,因此将内部 " 误解为 quotechar

要解决此问题,请设置 escapechar 以转义内部 "

df = pd.read_csv("sample.txt", escapechar="\\")
df



   A    B
0  3"4  5
1  6    7

在这里,我们需要"\\",因为Python中的字符\是转义字符,因此仅使用"\"最终会转义结束",从而导致语法错误。

指定注释

comment 参数用于标识注释 - 同一行中传递的字符之后的所有内容都将被视为注释,从而被忽略。

例如,考虑以下 sample.txt 文件:

A,B,C
3,4,5	# I am a comment
6,7,8	# I am a comment

忽略这些评论:

df = pd.read_csv("sample.txt", comment="#")
df



   A  B  C
0  3  4  5
1  6  7  8

相关用法


注:本文由纯净天空筛选整理自Isshin Inada大神的英文原创作品 Pandas | read_csv method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。