【发布时间】:2019-04-21 22:44:19
【问题描述】:
我有以下代码递归遍历包含数千个 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 的增长。
【问题讨论】:
-
您在循环中附加到 DataFrame,这会不必要地复制数据并且效率极低(这就是为什么开始时很好,但随后会停止的原因)。追加到循环内的列表并在之后连接一次。
-
Alexander's Solution 说明了这一点。
-
不错!我没有意识到这一点。如果我们尽可能地提高效率,Alexander 的解决方案的性能与串联相比有什么显着差异吗?
-
我只使用
csv模块tbh。我在增长这样的 DF 方面所做的每一次尝试都在降低速度和内存。我还没有找到解决它的方法。也许是奇怪的连接或连接,但是一旦你把它放在一个循环中,开销就会很大。