个性化阅读
专注于IT技术分析

pandas教程:使用read_csv()导入数据

pandas教程:使用read_csv()导入数据

任何数据科学项目的第一步都是导入数据。通常, 你将使用逗号分隔值(CSV)文件中的数据, 并在工作流程的开始就遇到问题。在本教程中, 你将看到如何使用pandas的read_csv()函数来处理导入数据时的常见问题, 并了解为什么现在特别是使用pandas加载CSV文件已成为当今工作数据科学家的标准做法。

文件系统

在使用pandas导入数据之前, 你需要知道数据在文件系统中的位置以及当前的工作目录是什么。你将很快明白为什么这很重要, 但是让我们回顾一些基本概念:

计算机上的所有内容都存储在文件系统中。 “目录”仅是”文件夹”的代名词, “工作目录”只是你当前所在的文件夹。srcmini上的Shell for Data Science入门课程将为你提供有关其的完整动手实践经验。实用程序, 但以下是一些基本的Shell命令, 可在文件系统中进行导航:

  • ls命令列出当前工作目录中的所有内容。
  • cd命令后跟:
    • 子目录的名称使你可以将工作目录更改为指定的子目录。
    • ..允许你导航回到当前工作目录的父目录。
  • pwd命令显示当前工作目录的路径。

IPython允许你通过IPython控制台的魔术命令直接执行Shell命令。以下是与你在上面看到的命令相对应的命令:

  • ! IPython中的ls与命令行中的ls相同。
  • IPython中的%cd与命令行中的cd相同。
  • ! IPython中的pwd与命令行中的pwd相同。在IPython中将其更改为工作目录后, 也会打印该目录, 而在命令行中则不是这种情况。

在你的文件系统中, 有一个名为grain.csv的文件, 其中包含80种谷物的营养数据。在IPython Shell中一一输入魔术命令, 看看是否可以找到数据集!

你是否在数据目录中找到它?优秀作品!

加载数据

现在, 你知道当前的工作目录是什么, 数据集在文件系统中的位置, 你可以指定该文件的文件路径。现在, 你可以使用pandas的read_csv()将CSV文件导入Python:

import pandas as pd
cereal_df = pd.read_csv("/tmp/tmp07wuam09/data/cereal.csv")
cereal_df2 = pd.read_csv("data/cereal.csv")

# Are they the same?
print(pd.DataFrame.equals(cereal_df, cereal_df2))
True

如你在上面的代码块中看到的那样, 文件路径是read_csv()的主要参数, 它以两种方式指定。你可以使用以/为前缀的完整文件路径, 并在规范中包括工作目录, 也可以使用不包含的完整文件路径。 read_csv()函数足够聪明, 可以解密它是使用完整文件路径还是相对文件路径, 并将平面文件转换为DataFrame不会出现问题。 (注意:每个srcmini会话的环境都是临时的, 因此你在上一节中看到的工作目录可能与在上面的代码块中看到的工作目录不同。)

继续, 看看其他pandas如何使导入CSV文件更容易。让我们使用函数的一些可自定义选项, 尤其是处理标头, 错误数据类型和丢失数据的方式。

处理标题

标题是指数据集的列名。对于你可能会遇到的某些数据集, 标题可能会完全丢失, 部分丢失或者它们可能存在, 但是你可能需要重命名它们。你如何有效处理大pandas的此类问题?

让我们仔细看看你的数据:

df = pd.read_csv("data/cereal.csv")
print(df.head(5))
                         X.1      X.2      X.3       X.4      X.5      X.6  \
0                       name      mfr     type  calories  protein      fat   
1                  100% Bran        N        C        70        4        1   
2          100% Natural Bran        Q  no info       120        3        5   
3                   All-Bran  no info        C        70        4        1   
4  All-Bran with Extra Fiber        K        C        50        4  no info   

      X.7    X.8      X.9    X.10     X.11      X.12   X.13     X.14  X.15  \
0  sodium  fiber    carbo  sugars   potass  vitamins  shelf   weight  cups   
1       .     10  no info       6      280        25      3        1  0.33   
2      15      2        8       8      135         0      .        1     1   
3     260      9        7       5  no info        25      3        1  0.33   
4     140     14        8       0      330        25      3  no info   0.5   

        X.16  
0     rating  
1  68.402973  
2    no info  
3  59.425505  
4  93.704912

似乎更明智的列名称将是name, mfr, …, rating, 但它们被错误地导入为数据集中的第一个观察值!让我们尝试将它们作为标题。 read_csv()函数具有一个称为skiprows的参数, 该参数使你可以指定文件开头要跳过的行数。在这种情况下, 你希望跳过第一行, 因此让我们尝试导入设置为等于1的行数的CSV文件:

df = pd.read_csv("data/cereal.csv", skiprows = 1)
print(df.head(5))
                        name      mfr     type  calories protein      fat  \
0                  100% Bran        N        C        70       4        1   
1          100% Natural Bran        Q  no info       120       3        5   
2                   All-Bran  no info        C        70       4        1   
3  All-Bran with Extra Fiber        K        C        50       4  no info   
4             Almond Delight        R        C       110       2        2   

  sodium  fiber    carbo  sugars   potass vitamins shelf   weight  cups  \
0      .   10.0  no info       6      280       25     3        1  0.33   
1     15    2.0        8       8      135        0     .        1  1.00   
2    260    9.0        7       5  no info       25     3        1  0.33   
3    140   14.0        8       0      330       25     3  no info  0.50   
4    200    1.0       14       8       -1        .     3        1  0.75   

      rating  
0  68.402973  
1    no info  
2  59.425505  
3  93.704912  
4  34.384843

真好!

即使未指定标题, read_csv()函数也可以正确推断出第一个观测值包含数据集的标题。不仅如此, read_csv()还可以推断数据集每一列的数据类型。你可以在卡路里列下面看到一个整数列, 而纤维列是一个浮点列:

print(df['calories'].dtypes)
print(df['fiber'].dtypes)
int64
float64

处理缺失值和不正确的数据类型

在大pandas中, 默认情况下, 具有字符串值的列存储为类型object。由于此数据集中的缺失值似乎都被编码为” no info”或”。”(两个字符串值), 因此检查了具有缺失值的列(例如fat列)的数据类型, 因此你可以看到其数据类型为”理想:

print(df['fat'].dtypes)
object

当列的数据类型是对象时, 简单的算术运算会导致意外的结果。在执行各种任务(可视化分布, 查找异常值, 训练模型)时, 这种行为可能会出现问题, 因为你希望Python将数字视为数字。

运行下面的代码以查看示例。你的数据集已作为df加载。

但是1 + 5不是15!

理想情况下, fat列应被视为int64或float64类型, 缺失数据应编码为NaN, 以便你可以以对缺失值友好的方式应用统计信息。而不是解析每个列并替换为” no info”和”。”。在加载数据集后使用NaN值, 则可以使用na_values参数说明加载数据集之前的值:

df = pd.read_csv("data/cereal.csv", skiprows = 1, na_values = ['no info', '.'])
print(df.head(5))
                        name  mfr type  calories  protein  fat  sodium  fiber  \
0                  100% Bran    N    C        70      4.0  1.0     NaN   10.0   
1          100% Natural Bran    Q  NaN       120      3.0  5.0    15.0    2.0   
2                   All-Bran  NaN    C        70      4.0  1.0   260.0    9.0   
3  All-Bran with Extra Fiber    K    C        50      4.0  NaN   140.0   14.0   
4             Almond Delight    R    C       110      2.0  2.0   200.0    1.0   

   carbo  sugars  potass  vitamins  shelf  weight  cups     rating  
0    NaN       6   280.0      25.0    3.0     1.0  0.33  68.402973  
1    8.0       8   135.0       0.0    NaN     1.0  1.00        NaN  
2    7.0       5     NaN      25.0    3.0     1.0  0.33  59.425505  
3    8.0       0   330.0      25.0    3.0     NaN  0.50  93.704912  
4   14.0       8    -1.0       NaN    3.0     1.0  0.75  34.384843

现在尝试使用你刚才看到的相同算法:

太棒了1 + 5确实是6。fat列中的值现在被视为数字。

概括

现在, 你对导入数据时需要注意的事项有了更好的了解, 让我们回顾一下。使用涉及pandas的read_csv()的单行代码, 你:

  • 找到要从文件系统导入的CSV文件。
  • 更正了数据集的标题。
  • 处理缺失值, 以便将其正确编码为NaN。
  • 数据集中每一列的更正数据类型。
  • 将CSV文件转换为Pandas DataFrame(请参阅为什么在本Pandas教程中如此重要)。

最后的想法

尽管CSV文件是存储数据的最常用格式之一, 但是现代数据科学家还必须熟悉其他文件类型。你现在已经很好地了解了导入CSV文件时pandas的实用性, 并且方便地, pandas提供了导入Excel, SAS和Stata文件的其他类似且同样方便的功能。

然而, 由于开源软件社区的活跃, 文件格式和导入数据的方式一直存在活动。许多有用的高质量数据集托管在Web上, 例如, 可以通过API访问。如果你好奇并想了解最新技术, srcmini的”以Python导入数据”(第1部分)和”以Python导入数据”(第2部分)课程将教你所有最佳实践。

学习愉快!

赞(0)
未经允许不得转载:srcmini » pandas教程:使用read_csv()导入数据

评论 抢沙发

评论前必须登录!