Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python熊猫-使用列表理解来压缩数据帧_Python_Performance_Pandas_Dataframe_List Comprehension - Fatal编程技术网

Python熊猫-使用列表理解来压缩数据帧

Python熊猫-使用列表理解来压缩数据帧,python,performance,pandas,dataframe,list-comprehension,Python,Performance,Pandas,Dataframe,List Comprehension,它在报告中指出: 然而,值得注意的是,concat(并因此附加)使 数据的完整副本,并且不断重复使用此函数可以 创造一个重要的性能打击。如果您需要使用该操作 在多个数据集上,使用列表 frames=[为文件中的f处理文件(f)] result=pd.concat(帧) 我目前的情况是,我将一个新的数据帧连接到一个不断增长的数据帧列表中。这将导致大量的连接 我担心性能,我不知道在这种情况下如何使用列表理解。我的代码如下 df = first_data_frame while verify == T

它在报告中指出:

然而,值得注意的是,concat(并因此附加)使 数据的完整副本,并且不断重复使用此函数可以 创造一个重要的性能打击。如果您需要使用该操作 在多个数据集上,使用列表

frames=[为文件中的f处理文件(f)]

result=pd.concat(帧)

我目前的情况是,我将一个新的数据帧连接到一个不断增长的数据帧列表中。这将导致大量的连接

我担心性能,我不知道在这种情况下如何使用列表理解。我的代码如下

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
我不认为下载数据和创建数据框架的部分是相关的;我关心的是常量连接


在这种情况下,如何实现列表理解?

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

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

pd.concat(frames)
您也可以将循环放入生成器函数中,然后使用列表理解,但这可能比您需要的更复杂


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

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

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)
结果是在我的i3上,在3秒钟内创建了超过一百万行(8列)的数据帧

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

dftot = pd.DataFrame()
for file in FileNames:
    df = GetFile(file)
    dftot = pd.concat([dftot, df])
要在代码中插入“如果”条件,请更改行:

df = [GetFile(file) for file in FileNames]
以这种方式,例如:

df = [GetFile(file) for file in FileNames if file == 'A.csv']
此代码仅读取“A.csv”文件