Python Pandas - 使用列表推导式合并数据框

7
pandas文档中,它指出:
值得注意的是,concat(因此也包括append)会创建数据的完整副本,并且经常重复使用此函数可能会导致性能下降。如果您需要在多个数据集上使用该操作,请使用列表推导式。
frames = [process_your_file(f) for f in files] result = pd.concat(frames)
我的当前情况是,我将一份新的数据框与一个不断增长的数据框列表连接起来。这将导致可怕数量的连接。
我担心性能问题,不确定如何在这种情况下使用列表推导式。我的代码如下。
df = first_data_frame
while verify == True:
    # download data (new data becomes available through each iteration)
    # then turn [new] data into data frame, called 'temp'
    frames = [df, temp]
    df = concat(frames)
    if condition_met:
        verify == False

我认为下载数据和创建数据框的部分并不相关,我的关注点是常量拼接。
在这种情况下,我该如何实现列表推导式?
2个回答

5

列表推导式非常快速和优雅。我还不得不从列表中链接许多不同的数据框架。这是我的代码:

import os
import pandas as pd
import numpy as np

# FileNames is a list with the names of the csv files contained in the 'dataset' path

FileNames = []
for files in os.listdir("dataset"):
    if files.endswith(".csv"):
        FileNames.append(files)

# function that reads the file from the FileNames list and makes it become a dataFrame

def GetFile(fnombre):
location = 'dataset/' + fnombre
df = pd.read_csv(location)
return df

# list comprehension
df = [GetFile(file) for file in FileNames]
dftot = pd.concat(df)

结果是一个包含超过一百万行(8列)数据的dataFrame,在我的i3上仅用3秒钟创建。

如果您将“列表推导式”这两行代码替换为以下代码,则会注意到性能下降:

dftot = pd.DataFrame()
for file in FileNames:
    df = GetFile(file)
    dftot = pd.concat([dftot, df])

要在您的代码中插入一个“IF”条件,请更改以下行:

df = [GetFile(file) for file in FileNames]

例如,以这种方式:

df = [GetFile(file) for file in FileNames if file == 'A.csv']

这段代码只读取了'A.csv'文件。


4
如果您有一个无法放入列表推导式中的循环(例如while循环),您可以在顶部初始化一个空列表,然后在while循环期间将其附加到该列表。示例:
frames = []
while verify:
    # download data
    # temp = pd.DataFrame(data)
    frames.append(temp)
    if condition_met:
        verify = False

pd.concat(frames)

你还可以将循环放在生成器函数中,然后使用列表推导式,但这可能比你需要的更加复杂。此外,如果您的数据自然而然地以字典列表或类似方式呈现,则可能不需要创建所有临时数据帧 - 只需将所有数据附加到一个巨大的字典列表中,然后在最后一次调用中将其转换为数据帧即可。

Append方法已经自1.4.0版本起被弃用,请使用concat()方法代替。详见:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.append.html - iD_Sgh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接