I would like to optimize the code below. It works but I would like suggestions if it can be done more concisely and efficiently.
import os
import glob
import pandas as pd
import numpy as np
files = glob.glob(os.path.join('data','*.csv'))
dfs = []
for file in files:
variable = os.path.basename(file).split("_")[0] #split filename
df= pd.read_csv(file)
df['variable'] = variable #assign variable
dfs.append(df)
finalDf = pd.concat(dfs, ignore_index = True)
Any ideas ? Thank you in advance
Pandas 0.21.1 and Python 3.6.5
答案 0 :(得分:1)
您的代码结构非常好。连接数据帧列表比重复附加到现有数据帧更有效。
您可以尝试和优化的是读取您的csv文件,即df = pd.read_csv(file)
。我唯一的建议是使用字典将列名称映射到类型来指定dtype
参数。特别是,如果您有包含分类数据的列,请映射到'category'
以确保优化内存使用。
您提到了更简洁的代码。您可以使用pd.DataFrame.assign
创建新系列并将其设置为您的文件名。此外,您可以使用列表理解:
dfs = [pd.read_csv(file).assign(variable=os.path.basename(file).split('_')[0]) \
for file in glob.glob(os.path.join('data','*.csv'))]
finalDf = pd.concat(dfs, ignore_index=True)
如果选择此方法,可能会失去可读性,因此请记录您正在做的事情。