问题。如何在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)
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
幽默的程序员
当 深度学习算法得到的大部分积极反馈都是讽刺性的时候,就很难训练它们。