原文:
www.kdnuggets.com/2020/08/5-different-ways-load-data-python.html
作为一个初学者,你可能只知道一种加载数据的方法(通常是 CSV),那就是使用pandas.read_csv函数读取它。这是一个最成熟和强大的函数,但其他方法也非常有用,有时会派上用场。
我将要讨论的方法有:
-
手动函数
-
loadtxt函数
-
genfromtxt函数
-
read_csv函数
-
Pickle
我们将使用的数据集可以在这里找到。它被命名为 100-Sales-Records。
我们将使用 Numpy、Pandas 和 Pickle 包,所以要导入它们。
import numpy as np
import pandas as pd
import pickle
这是最困难的,因为你必须设计一个自定义函数来加载数据。你需要处理 Python 的常规文件概念,并使用这些概念来读取*.csv*文件。
让我们对 100 销售记录文件进行操作。
def load_csv(filepath):
data = []
col = []
checkcol = False
with open(filepath) as f:
for val in f.readlines():
val = val.replace("\n","")
val = val.split(',')
if checkcol is False:
col = val
checkcol = True
else:
data.append(val)
df = pd.DataFrame(data=data, columns=col)
return df
嗯,这是什么???看起来有点复杂的代码!!让我们一步步解析,以便你了解发生了什么,并可以应用类似的逻辑来读取自己的*.csv*文件。
在这里,我创建了一个load_csv函数,它接受一个参数,即你想读取的文件路径。
我有一个名为data的列表,它将包含我的 CSV 文件数据,还有另一个名为col的列表,它将包含我的列名。现在在手动检查 CSV 文件后,我知道我的列名在第一行,所以在第一次迭代中,我需要将第一行的数据存储在col中,其余的行存储在data中。
为了检查第一次迭代,我使用了一个名为checkcol的布尔变量,它的值为 False,当第一次迭代中它的值为 False 时,它会将第一行的数据存储在col中,然后将checkcol设置为 True,这样我们就会处理data列表,并将其余的值存储在data列表中。
这里的主要逻辑是,我使用*readlines()*函数遍历文件。这个函数返回一个包含文件中所有行的列表。
在读取标题时,它将新行检测为*\n字符,这是一种行终止字符,因此为了去除它,我使用了str.replace*函数。
由于这是一个*.csv文件,所以我必须根据逗号来分隔内容,因此我将使用string.split(',')来分割字符串。在第一次迭代中,我将把包含列名的第一行存储在一个名为col的列表中。然后,我将把所有数据追加到名为data*的列表中。
为了更优雅地读取数据,我将其返回为数据框格式,因为数据框比 numpy 数组或 Python 列表更易于阅读。
myData = load_csv('100 Sales Record.csv')
print(myData.head())
自定义函数中的数据。
其重要好处是你对文件结构有全部的灵活性和控制权,可以按照你想要的格式和方式读取并存储数据。
你也可以使用自己的逻辑读取没有标准结构的文件。
其重要缺点是编写复杂,特别是对于标准类型的文件,因为它们可以很容易地被读取。你必须硬编码逻辑,这需要反复试验。
你应该仅在文件格式非标准或你需要灵活性并以库无法提供的方式读取文件时使用它。
这是 Numpy 库中的一个内置函数,Numpy 是 Python 中的一个著名数值库。这个函数非常简单,适合加载数据。它对于读取相同数据类型的数据非常有用。
当数据更复杂时,使用这个函数很难读取,但当文件简单易读时,这个函数确实非常强大。
要获取单一类型的数据,你可以下载this虚拟数据集。让我们跳到代码部分。
df = np.loadtxt('convertcsv.csv', delimeter = ',')
这里我们简单地使用了loadtxt函数,并将delimeter设置为*','*,因为这是一个 CSV 文件。
现在如果我们打印df,我们会看到我们的数据以相当不错的 numpy 数组形式呈现,准备好使用。
print(df[:5,:])
由于数据量大,我们只打印了前 5 行。
使用这个函数的一个重要方面是你可以快速地将数据从文件加载到 numpy 数组中。
它的缺点是你不能在数据中拥有不同的数据类型或缺失的行。
我们将使用数据集‘100 Sales Records.csv’,这是我们在第一个例子中使用的,以演示我们可以在其中拥有多种数据类型。
让我们跳到代码部分。
data = np.genfromtxt('100 Sales Records.csv', delimiter=',')
为了更清楚地看到这一点,我们可以以数据框格式查看,即:
>>> pd.DataFrame(data)
等等?这是什么?哦,它跳过了所有包含字符串数据类型的列。怎么处理这个问题?
只需添加另一个dtype参数并将dtype设置为 None,这意味着它必须自行处理每一列的数据类型,而不是将整个数据转换为单一的数据类型。
data = np.genfromtxt('100 Sales Records.csv', delimiter=',', dtype=None)
然后输出为:
>>> pd.DataFrame(data).head()
比第一个更好,但是这里我们的列标题变成了行,要将它们设置为列标题,我们必须添加另一个参数,即names,并将其设置为True,这样它会将第一行作为列标题。
即
data = np.genfromtxt('100 Sales Records.csv', delimiter=',', dtype=None, names = True)
我们可以将其打印为:
>>> pd.DataFrame(df3).head()
在这里我们可以看到,它成功地将列名添加到了数据框中。
现在最后一个问题是那些数据类型为字符串的列实际上并不是字符串,而是以字节格式存储的。你可以看到每个字符串前面都有一个b',所以为了处理它们,我们需要将它们解码为 utf-8 格式。
df3 = np.genfromtxt('100 Sales Records.csv', delimiter=',', dtype=None, names=True, encoding='utf-8')
这将返回我们所需格式的数据框。
>>> pd.DataFrame(df3)
Pandas 是一个非常流行的数据处理库,而且使用非常广泛。它非常重要且成熟的一个函数是read_csv(),它可以非常容易地读取任何**.csv**文件,并帮助我们处理它。让我们在我们的 100-Sales-Record 数据集上做这个。
这个函数因其易用性而非常受欢迎。你可以将它与我们之前的代码进行比较,并检查它。
>>> pdDf = pd.read_csv('100 Sales Record.csv')
>>> pdDf.head()
你猜怎么着?我们完成了。这实际上是非常简单和易于使用的。Pandas.read_csv 确实提供了许多其他参数来调整我们的数据集,例如在我们的convertcsv.csv文件中,我们没有列名,所以我们可以这样读取它:
>>> newdf = pd.read_csv('convertcsv.csv', header=None)
>>> newdf.head()
我们可以看到它读取了没有标题的csv文件。你可以在官方文档中探索所有其他参数这里。
当你的数据不是以良好的、可读的格式存在时,你可以使用 pickle 将其保存为二进制格式。然后你可以使用 pickle 库轻松重新加载它。
我们将取出我们的 100-Sales-Record CSV 文件,并首先将其保存为 pickle 格式,以便我们可以读取它。
with open('test.pkl','wb') as f:
pickle.dump(pdDf, f)
这将创建一个新的文件test.pkl,其中包含我们来自Pandas标题的pdDf。
现在要使用 pickle 打开它,我们只需使用pickle.load函数。
with open("test.pkl", "rb") as f:
d4 = pickle.load(f)
>>> d4.head()
在这里,我们成功地从 pickle 文件中加载了数据,格式为pandas.DataFrame。
你现在知道了 5 种在 Python 中加载数据文件的方法,这可以帮助你在日常项目中以不同的方式加载数据集。
1. 谷歌网络安全证书 - 快速开启网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 在 IT 方面支持你的组织