除了 pandas 和 dask 之外,还都有哪些更快的读取大数据集和应用行明智操作的方法?

Posted

技术标签:

【中文标题】除了 pandas 和 dask 之外,还都有哪些更快的读取大数据集和应用行明智操作的方法?【英文标题】:What are faster ways of reading big data set and apply row wise operations other than pandas and dask?除了 pandas 和 dask 之外,还有哪些更快的读取大数据集和应用行明智操作的方法? 【发布时间】:2020-10-26 04:04:19 【问题描述】:

我正在编写一个代码,我需要根据大表的每一行填充一组数据结构。现在,我正在使用 pandas 来读取数据并进行一些基本的数据验证预处理。但是,当我进入流程的其余部分并将数据放入相应的数据结构中时,完成循环并填充我的数据结构需要相当长的时间。例如,在下面的代码中,我有一个包含 15 M 记录的表。表有三列,我基于每一行创建一个 foo() 对象并将其添加到列表中。

# Profile.csv 
# Index    | Name | Family| DB
# ---------|------|-------|----------
# 0.       | Jane | Doe   | 08/23/1977
# ...
# 15000000 | Jhon | Doe   | 01/01/2000

class foo():
    def __init__(self, name, last, bd):
        self.name = name
        self.last = last
        self.bd = bd

def populate(row, my_list):
    my_list.append(foo(*row))

# reading the csv file and formatting the date column
df = pd.read_csv('Profile.csv')
df['DB'] = pd.to_datetime(df['DB'],'%Y-%m-%d')

# using apply to create an foo() object and add it to the list
my_list = []
gf.apply(populate, axis=1, args=(my_list,))

所以在使用 pandas 将字符串日期转换为日期对象之后,我只需要遍历 DataFrame 来创建我的对象并将它们添加到列表中。这个过程非常耗时(在我的真实示例中,它甚至需要更多时间,因为我的数据结构更复杂并且我有更多列)。所以,我想知道在这种情况下提高我的运行时间的最佳做法是什么。我什至应该使用pandas 来读取我的大表并逐行处理它们吗?

【问题讨论】:

【参考方案1】:

使用文件句柄会更快:

input_file = "profile.csv"
sep=";"
my_list = []
with open(input_file) as fh:
    cols = 
    for i, col in enumerate(fh.readline().strip().split(sep)):
        cols[col] = i
    for line in fh:
        line = line.strip().split(sep)
        date = line[cols["DB"]].split("/")
        date = [date[2], date[0], date[1]]
        line[cols["DB"]] = "-".join(date)
        populate(line, my_list)

【讨论】:

感谢@Wazaa,这是个好主意,但是,如果您想将字符串日期转换为日期对象,则每行的转换时间比 pandas 长一点。如果您有多个日期字段,这种过度转换可能会影响我们通过文件处理程序获得的所有节省。 这可能有助于peterbe.com/plog/fastest-python-datetime-parser 还有***.com/questions/43726661/…【参考方案2】:

对于这种情况有多种方法,但是,如果可能的话,最快和最有效的方法是使用矢量化。我在这篇文章中使用矢量化演示的示例的解决方案如下:

my_list = [foo(*args) for args in zip(df["Name"],df["Family"],df["BD"])]

如果无法进行矢量化,将数据帧转换为字典可以显着提高性能。对于当前示例,如果将类似于:

my_list = []
dc = df.to_dict()
for i, j in dc.items():
    my_list.append(foo(dc["Name"][i], dc["Family"][i], dc["BD"][i]))

如果结构和流程的类型更复杂,最后一种解决方案特别有效。

【讨论】:

以上是关于除了 pandas 和 dask 之外,还都有哪些更快的读取大数据集和应用行明智操作的方法?的主要内容,如果未能解决你的问题,请参考以下文章

Java 中除了 MDB 之外还都有哪些其他可能性来对消息消费者进行编程?

除了 React,还都有哪些 JS 框架允许实时编辑?

除了 gcc 还都有哪些编译器可以向量化代码?

除了Arduino,还都有哪些开源硬件

web请求除了get和post还都有哪些方式?

除了wireshark,还都有哪些抓包工具呢