Python Pandas - 使用列表理解来连接数据框
Python Pandas - Using list comprehension to concat data frames
在 pandas documentation 中,它指出:
It is worth noting however, that concat (and therefore append) makes a
full copy of the data, and that constantly reusing this function can
create a signifcant performance hit. If you need to use the operation
over several datasets, use a list comprehension.
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
我认为下载数据和创建数据框的部分不相关;我担心的是不断的串联。
在这种情况下如何实现列表理解?
如果您有一个无法放入列表推导式的循环(如 while 循环),您可以在顶部初始化一个空列表,然后在 while 循环期间附加到它。示例:
frames = []
while verify:
# download data
# temp = pd.DataFrame(data)
frames.append(temp)
if condition_met:
verify = False
pd.concat(frames)
您也可以将循环放在生成器函数中,然后使用列表理解,但这可能比您需要的更复杂。
此外,如果您的数据自然地以字典列表或类似的形式出现,您可能不需要创建所有临时数据框 - 只需将所有数据附加到一个巨大的字典列表中,然后将其转换最后一次调用到数据框。
列表理解非常快速和优雅。我还必须将列表中的许多不同数据帧链接在一起。这是我的代码:
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 列)的数据帧。
如果用这些替换两行代码 "list comprehension",您会注意到性能下降:
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' 文件
在 pandas documentation 中,它指出:
It is worth noting however, that concat (and therefore append) makes a full copy of the data, and that constantly reusing this function can create a signifcant performance hit. If you need to use the operation over several datasets, use a list comprehension.
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
我认为下载数据和创建数据框的部分不相关;我担心的是不断的串联。
在这种情况下如何实现列表理解?
如果您有一个无法放入列表推导式的循环(如 while 循环),您可以在顶部初始化一个空列表,然后在 while 循环期间附加到它。示例:
frames = []
while verify:
# download data
# temp = pd.DataFrame(data)
frames.append(temp)
if condition_met:
verify = False
pd.concat(frames)
您也可以将循环放在生成器函数中,然后使用列表理解,但这可能比您需要的更复杂。
此外,如果您的数据自然地以字典列表或类似的形式出现,您可能不需要创建所有临时数据框 - 只需将所有数据附加到一个巨大的字典列表中,然后将其转换最后一次调用到数据框。
列表理解非常快速和优雅。我还必须将列表中的许多不同数据帧链接在一起。这是我的代码:
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 列)的数据帧。
如果用这些替换两行代码 "list comprehension",您会注意到性能下降:
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' 文件