将CSV文件读入Pandas数据框架的17种方法

715 阅读9分钟

问题。如何在Python中把CSV文件导入到Pandas DataFrame中?

本文将讨论最有趣的例子,将CSV文件读取到Pandas DataFrame中。

如果没有特别说明,我们在所有的例子中都使用下面这个CSV文件。

**my_file.csv**:

Name,Job,Age,Income
Alice,Programmer,23,110000
Bob,Executive,34,90000
Carl,Sales,45,50000

让我们开始吧!

例子1 - CSV到数据框架

要将一个给定的CSV文件导入一个新创建的Pandas DataFrame,请使用pd.read_csv('my_file.csv') ,该函数返回一个以CSV文件中的内容创建的DataFrame'my_file.csv'

下面是一个快速和通用的代码片断,展示了这种方法。

import pandas as pd
df = pd.read_csv('my_file.csv')
print(df)

输出。

    Name         Job  Age  Income
0  Alice  Programmer   23  110000
1    Bob   Executive   34   90000
2   Carl       Sales   45   50000

你通过三个步骤将CSV文件转换为一个DataFrame。(1)导入pandas库,(2)使用 [pd.read_csv()](https://blog.finxter.com/read-and-write-flat-files-with-pandas/)并将文件名作为一个字符串参数传递,以及(3)打印生成的DataFrame(可选)。

  • import pandas as pd
  • df = pd.read_csv('my_file.csv')
  • print(df)

例2--从CSV中导入特定的列

如果你想导入CSV中的某一特定列,请使用参数usecols=['column_name']

下面的例子只使用这种方法读取列'Name'

import pandas as pd
df = pd.read_csv('my_file.csv', usecols= ['Name'])
print(df)

输出。

    Name
0  Alice
1    Bob
2   Carl

例3--从CSV中导入子集的列

如果你想从CSV中导入一个子集的列,使用参数usecols= ['column_name_1','column_name_2']

import pandas as pd
df = pd.read_csv('my_file.csv', usecols= ['Name','Age'])
print(df)

输出。

    Name  Age
0  Alice   23
1    Bob   34
2   Carl   45

例4 - 为CSV文件使用自定义分隔符

你可以通过添加可选的参数sep ,为CSV文件指定一个自定义分隔符。

  • 要使用表格分隔符,请使用sep='\t' ,作为pd.read_csv() 的参数。
  • 要使用分号分隔符,请使用sep=';' ,作为pd.read_csv() 的参数。
  • pd.read_csv() 的默认分隔符参数是sep=','
import pandas as pd
df = pd.read_csv('my_file.csv', sep='\t')
print(df)

如果在文件'my_file.csv' 中使用表格字符作为分隔符,本例将生成与例1中已显示的相同的DataFrame。

    Name         Job  Age  Income
0  Alice  Programmer   23  110000
1    Bob   Executive   34   90000
2   Carl       Sales   45   50000

例5 - 读取带有自定义标题的CSV文件

默认情况下,CSV文件的第一行将被df.read_csv() 函数作为DataFrame的标题。

要将CSV文件读入带有自定义页眉的DataFrame,请调用pd.read_csv("my_file.csv", skiprows=1, names=column_names)

  • skiprows=1 确保你将跳过包含默认列名的第一行。我们将在下面更详细地探讨这个问题。
  • names=column_names 将存储在变量中的列名作为一个列表传给 。这些是新创建的DataFrame的新列名(=headers)。['Spouse', 'Former Job', 'Insta Followers', 'Insta Likes']

下面是一个例子。

import pandas as pd
column_names = ['Spouse', 'Former Job', 'Insta Followers', 'Insta Likes']
df = pd.read_csv("my_file.csv", skiprows=1, names=column_names)
print(df)

输出。

  Spouse  Former Job  Insta Followers  Insta Likes
0  Alice  Programmer               23       110000
1    Bob   Executive               34        90000
2   Carl       Sales               45        50000

例6 - 使用自定义标题跳过CSV的前n行

import pandas as pd

n = 2  # no. of rows to skip
column_names = ['Spouse', 'Former Job', 'Insta Followers', 'Insta Likes']
df = pd.read_csv("my_file.csv", skiprows=2, names=column_names)

print(df)

输出。

  Spouse Former Job  Insta Followers  Insta Likes
0    Bob  Executive               34        90000
1   Carl      Sales               45        50000

当设置skiprows=2 ,第一行(=原始标题)和第二行(=CSV的第一行)现在被跳过。

例7 - 读取带有第i行标题的CSV文件

要读取CSV文件,并在i-第1行设置页眉,你可以像这样把行索引i 作为页眉参数。pd.read_csv("my_file.csv", header = i).i-第1行现在将被作为新创建的DataFrame的列标题。

下面的例子显示了如何将CSV读到DataFrame中,其标题在第二行,索引为i=1

import pandas as pd

i = 1    # header row index
df = pd.read_csv("my_file.csv", header = i)

print(df)

输出。

  Alice Programmer  23  110000
0   Bob  Executive  34   90000
1  Carl      Sales  45   50000

在这个例子中,CSV的第二行被作为标题。第一行被完全忽略了。

例子 8 - 读取没有页眉的CSV文件

如果你在调用pd.read_csv("my_file.csv", header=None) 时指定header=None ,Python 将分配连续的整数值 (0, 1, 2, ...) 作为列名。

import pandas as pd
df = pd.read_csv("my_file.csv", header=None)
print(df)

输出。

       0           1    2       3
0   Name         Job  Age  Income
1  Alice  Programmer   23  110000
2    Bob   Executive   34   90000
3   Carl       Sales   45   50000

例 9 - 读取 CSV 自定义列头名称。前缀

如果你在调用pd.read_csv("my_file.csv", header=None) 时指定header=None ,Python 将分配连续的整数值 (0, 1, 2, ...) 作为列名。

如果你想批量修改列名,你可以额外指定前缀参数,即在每个连续的整数列名前插入一个前缀字符串。

例如,prefix='Col_'header=None 结合使用,将产生列名。

  • 'Col_0'
  • 'Col_1'
  • 'Col_2'
  • ...

下面是代码规范。

import pandas as pd
df = pd.read_csv("my_file.csv", header=None, prefix='Col_')
print(df)

输出。

   Col_0       Col_1 Col_2   Col_3
0   Name         Job   Age  Income
1  Alice  Programmer    23  110000
2    Bob   Executive    34   90000
3   Carl       Sales    45   50000

例10--将特定值设置为NaN(缺失值)

如果你想把CSV中的特定值设置为"非数字"(NaN),你可以使用列表参数na_values=[val_1, ...] ,该参数有一个元素,当CSV加载到DataFrame时,每个值都会被设置为NaN

下面是一个将数值'Alice'23 设置为NaN 的例子。

import pandas as pd
df = pd.read_csv("my_file.csv", na_values=['Alice', 23])
print(df)

输出。

   Name         Job   Age  Income
0   NaN  Programmer   NaN  110000
1   Bob   Executive  34.0   90000
2  Carl       Sales  45.0   50000

缺少的值用粗体字突出显示。

例11--在URL上加载CSV到DataFrame中

给出带有所需CSV文件位置的字符串URL(例如,"https://www.my_url.com/my_file.csv" )。你可以通过将URL作为pd.read_csv() 函数的第一个参数,而不是本地文件路径,将内容加载到DataFrame。

Pandas会自动计算出这是一个URL。😉

import pandas as pd
df = pd.read_csv("https://www.my_url.com/my_file.csv")
print(df)

输出 - 假设CSV文件确实存在。

    Name         Job  Age  Income
0  Alice  Programmer   23  110000
1    Bob   Executive   34   90000
2   Carl       Sales   45   50000

例子12 - 跳过最后的i行加载CSV到DataFrame

你可以通过在pd.read_csv() 函数中设置skipfooter=i 参数来跳过最后的i 行。CSV的第一行仍将是用于列名的标题。但是最后的i 行将从CSV中被忽略。

下面是一个例子。

import pandas as pd
df = pd.read_csv("my_file.csv", skipfooter=2)
print(df)

输出。

    Name         Job  Age  Income
0  Alice  Programmer   23  110000

第一行仍然被作为标题。但是最后的i=2 行被跳过,所以剩下的DataFrame只有一行。

例13--加载CSV到DataFrame时忽略注释行

假设你有一个带有一些注释的CSV文件(例如,以标签字符'#' 开始)。

**'my_file.csv'**:

Name,Job,Age,Income
Alice,Programmer,23,110000
# Ignore this line
Bob,Executive,34,90000
Carl,Sales,45,50000
# This line is ignored too

你可以加载CSV文件并忽略那些以特定 "注释字符"(如符号'#' )开始的行,方法是将参数comment='#' 传递给pd.read_csv() 函数。

下面是一个例子。

import pandas as pd
df = pd.read_csv("my_file.csv", comment="#")
print(df)

输出是忽略了注释行的DataFrame。

    Name         Job  Age  Income
0  Alice  Programmer   23  110000
1    Bob   Executive   34   90000
2   Carl       Sales   45   50000

如果不设置注释参数,DataFrame将试图加载注释行,这在实际的代码项目中会产生非常奇怪的行为。

                         Name         Job   Age    Income
0                       Alice  Programmer  23.0  110000.0
1          # Ignore this line         NaN   NaN       NaN
2                         Bob   Executive  34.0   90000.0
3                        Carl       Sales  45.0   50000.0
4  # This line is ignored too         NaN   NaN       NaN

突出显示的行显然不是我们想要的行为,所以要相应地使用comment 参数来解决这个问题!

例子14 - 测量导入CSV到DataFrame时的运行时间

pd.read_csv() 函数的verbose=True 参数允许你测量加载一个CSV文件时的运行时间。

对于小的CSV文件,由于高速的效率,耗费的运行时间将总是产生0。但对于性能要求高的项目或大规模的CSV文件,这个参数可以使你的生活更轻松

import pandas as pd
df = pd.read_csv("my_file.csv", verbose=True)
print(df)

输出。

Tokenization took: 0.00 ms
Type conversion took: 0.00 ms
Parser memory cleanup took: 0.00 ms
    Name         Job  Age  Income
0  Alice  Programmer   23  110000
1    Bob   Executive   34   90000
2   Carl       Sales   45   50000

在我们的案例中,由于CSV文件较小,所以耗费的运行时间确实很快。但是对于更大的、真实世界的CSV文件,这可以让你对你的代码的瓶颈有一个很好的了解,以便进行性能分析

例子15--Pandas DataFrame到CSV

给出一个Pandas DataFrame。如何将其保存在CSV文件中?

你可以将一个列表转换为 PandasDataFrame,为你提供强大的功能,如to_csv() 方法。这是最简单的方法,它可以让你避免导入另一个库(反正我在很多Python项目中使用Pandas)。

salary = [['Alice', 'Data Scientist', 122000],
          ['Bob', 'Engineer', 77000],
          ['Ann', 'Manager', 119000]]

import pandas as pd
df = pd.DataFrame(salary)
df.to_csv('file2.csv', index=False, header=False)

输出。

# file2.csv
Alice,Data Scientist,122000
Bob,Engineer,77000
Ann,Manager,119000

例子16 - CSV转数据框架 设置特定值为真

你可以在加载CSV文件到DataFrame时,通过定义true_values 参数,将特定的值设置为True 。只需在pd.read_csv() 函数中传递一个要作为True 的值的列表。

例如,true_values=['Alice', 'Bob'] 将在DataFrame中把每个出现的'Alice''Bob' 设置为True

import pandas as pd
df = pd.read_csv("my_file.csv", true_values=['Alice', 'Bob'])
print(df)

输出。

    Name         Job  Age  Income
0  True  Programmer   23  110000
1    True   Executive   34   90000
2   Carl       Sales   45   50000

例子17 - CSV到DataFrame 设置特定值为假值

你可以通过定义false_values 参数,在加载CSV文件到DataFrame时,将特定的值设置为False 。只需在pd.read_csv() 函数中传递一个要作为False 的值的列表。

例如,false_values=['Alice', 'Bob'] 将在DataFrame中把每个出现的'Alice''Bob' 设置为False

import pandas as pd
df = pd.read_csv("my_file.csv", false_values=['Alice', 'Bob'])
print(df)

输出。

    Name         Job  Age  Income
0  False  Programmer   23  110000
1    False   Executive   34   90000
2   Carl       Sales   45   50000

幽默的程序员

深度学习算法得到的大部分积极反馈都是讽刺性的时候,就很难训练它们。