【问题标题】:Python Pandas - Using list comprehension to concat data framesPython Pandas - 使用列表理解来连接数据帧
【发布时间】:2015-10-08 04:31:07
【问题描述】:

pandas documentation 中,它声明:

然而值得注意的是,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

我不认为下载数据和创建数据框的部分是相关的;我担心的是不断的串联。

在这种情况下如何实现列表推导?

【问题讨论】:

    标签: python performance pandas dataframe list-comprehension


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      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])
      

      要在代码中插入“IF”条件,请更改行:

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

      以这种方式为例:

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

      此代码仅读取“A.csv”文件

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-22
        • 2019-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-21
        相关资源
        最近更新 更多