Python Pandas - 使用列表推导来连接数据框

时间:2015-10-08 04:31:07

标签: python performance pandas dataframe list-comprehension

pandas documentation中,它声明:

  

值得注意的是,concat(因此追加)会产生一个   完整的数据副本,并不断重用此功能即可   创造一个重要的性能打击。如果需要使用该操作   在几个数据集上,使用列表推导。

     

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 个答案:

答案 0 :(得分:3)

如果你有一个不能被放入列表理解的循环(比如while循环),你可以在顶部初始化一个空列表,然后在while循环期间附加到它。例如:

frames = []
while verify:
    # download data
    # temp = pd.DataFrame(data)
    frames.append(temp)
    if condition_met:
        verify = False

pd.concat(frames)

您也可以将循环放在生成器函数中,然后使用列表推导,但这可能比您需要的更复杂。

此外,如果您的数据自然地作为一个dicts或类似的列表,您可能不需要创建所有临时数据帧 - 只需将所有数据附加到一个巨大的dicts列表中,然后将其转换为最后一次调用中的数据帧。

答案 1 :(得分:3)

列表理解非常快速且优雅。我还必须将列表中的许多不同数据框链接在一起。这是我的代码:

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)

结果是在3秒钟内在我的i3上创建了超过一百万行(8列)的dataFrame。

如果用以下两行代码替换“列表理解”,则会发现性能下降:

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”文件