我们回顾了五种引入数据的Python技术,并附有代码实例供你参考。本文作者是 Ahmad Anis,他是一位机器学习和数据科学的学生。今年4月15日发表于Python。
关注《Python学研大本营》
Manual函数
loadtxt函数
genfromtxt函数
read_csv函数
Pickle
作为一个初学者,你可能只知道加载数据(通常是CSV格式)的单一方式,即使用pandas.read_csv函数来读取数据。这是最成熟和强大的函数之一,但其他方法也有很多帮助,而且有时肯定会派上用场。
我将讨论的方法是。
Manual函数 loadtxt函数 genfromtxt函数 read_csv函数 Pickle 我们要用来加载数据的数据集可以在这里找到。它被命名为100-Sales-Records。http://eforexcel.com/wp/downloads-18-sample-csv-files-data-sets-for-testing-sales/
我们将使用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的布尔变量,它是假的,当它在第一次迭代中为假时,它将第一行的数据存储在col中,然后它将checkcol设置为真,所以我们将处理数据列表并将其余的值存储在数据列表中。
这里的主要逻辑是,我使用Python中的readlines()函数在文件中进行迭代。这个函数返回一个包含文件中所有行的列表。
在阅读标题时,它检测到一个新的行是 \n 字符,它是行的结束符,所以为了删除它,我使用了 str.replace 函数。
由于它是一个.csv文件,所以我必须根据逗号来分隔东西,所以我将使用string.split(',')来分割字符串。对于第一次迭代,我将存储第一行,其中包含列名在一个名为col的列表中。然后,我将把所有的数据附加到我的列表中,称为data。
为了更漂亮地阅读数据,我将其作为数据框架格式返回,因为与numpy数组或python的列表相比,阅读数据框架更容易。
myData = load_csv('100 Sales Record.csv')
print(myData.head())
它的重要的好处是,你对文件结构有所有的灵活性和控制权,你可以用你想要的任何格式和方式来读取和存储它。
你也可以用你自己的逻辑来读取没有标准结构的文件。
它的重要缺点是,写起来很复杂,特别是对于标准类型的文件,因为它们很容易被读取。你必须对逻辑进行硬编码,这需要试验和错误。
你应该只在文件不是标准格式,或者你想要灵活地读取文件的方式,而这是库所不具备的,才使用它。
这是Numpy中的一个内置函数,Numpy是Python中一个著名的数值库。它是一个非常简单的加载数据的函数。它对于读取相同数据类型的数据非常有用。
当数据比较复杂时,使用这个函数很难读取,但当文件比较容易和简单时,这个函数真的很强大。
为了获得单一类型的数据,你可以下载这个假数据集。https://docs.google.com/spreadsheets/d/16mgiYbNz-XaW_r6GXUy2cJ0hy2E-lxwFLaVXAYIAOj0/edit?usp=sharing 让我们跳到代码。
df = np.loadtxt('convertcsv.csv', delimeter = ',')
这里我们简单地使用了loadtxt函数,因为这是一个CSV文件,所以在delimeter中传递了','。
现在,如果我们打印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,这意味着它必须照顾到每一列的数据类型本身。而不是将整个数据转换为单一的dtype。
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-销售记录数据集上做一下。
这个函数由于其易于使用而非常流行。你可以把它与我们以前的代码进行比较,你可以检查一下。
>>> 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文件。你可以在这里的官方文档中探索所有其他参数。https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html#pandas.read_csv
当你的数据不是一个好的、人类可读的格式时,你可以使用pickle把它保存为二进制格式。然后你可以使用pickle库轻松地重新加载它。
我们将采取我们的100-销售记录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()
而在这里,我们已经成功地从pandas.DataFrame格式的pickle文件中加载数据。
你现在知道了在Python中加载数据文件的5种不同方法,当你在日常项目中工作时,这些方法可以帮助你以不同方式加载数据集。
最后,附上有关Python的必读书单,轻松搞定有关Python问题。
精彩回顾
用Python写前端是什么体验?
Python面试必须知道的15个问题
Kindle退出中国怎么办?快用Python下载你的电子书
自然语言三兄弟NLP、NLU、NLG傻傻分不清?一文搞懂它们的区别
《人体系统调优不完全指南》火了!我们整理了一份《程序员健康指南》!
关注《Python学研大本营》