垂直有效地增长大型数据框

时间:2018-11-19 14:37:49

标签: python pandas

我有以下代码,该代码递归地遍历包含数千个csv的目录,并尝试将它们全部读取并添加到一个DataFrame中:

df = pd.DataFrame()
symbol = symbol.upper()

for filepath in glob.iglob(r'W:\data\{0}\option\**\**\**.csv'.format(188), recursive=True):

    optionNameCSI = filepath.split("\\")[-1].split('.')[0]
    try:
        tmp = pd.read_csv(filepath, engine='c')
        strike = tmp['Strike'].iloc[-1]
        expiry = pd.to_datetime(tmp['Option Expiration Date'].iloc[-1])
        m = expiry.month
        y = expiry.year
        PutCall = tmp['PutCall'].iloc[-1]
        future = symbol + numToLetter[m] + str(y)
    except (IndexError, KeyError) as e:
        continue

    if tmp.empty:
        df = tmp
    else:
        df = df.append(tmp)

    print(optionName, 'loaded')

但是,此代码开始迭代非常快,然后呈指数下降,并且永远不会完成。我做错了什么吗?我知道文件路径都可以正确获取,所以问题在于DataFrame的增长。

1 个答案:

答案 0 :(得分:3)

考虑将您的代码分成单独的函数,如下所示:

def get_data_from_csv(filepath):
    optionNameCSI = filepath.split("\\")[-1].split('.')[0]
    try:
        df = pd.read_csv(filepath, engine='c')
        # do stuff ...
        return df
    except (IndexError, KeyError) as e:
        return

然后您可以使用列表推导来收集列表中的所有数据,就像上面的人建议的那样

filepaths = glob.iglob(r'W:\data\{0}\option\**\**\**.csv'.format(188), recursive=True)
result = [get_data_from_csv(filepath) for filepath in filepaths]
result = [r for r in result if r is not None] # remove 'None' values

然后使用pd.concat

联接数据
df = pd.concat(result)