【发布时间】:2020-08-03 10:46:25
【问题描述】:
大约 2 年前,有人用一种非常优雅的方式将多个 csv 文件读入一个数据帧: Import multiple csv files into pandas and concatenate into one DataFrame
filepaths = [f for f in listdir("./data") if f.endswith('.csv')]
df = pd.concat(map(pd.read_csv, filepaths))
但是,如果您想要一个不同的分隔符或者您的 csv 文件没有标题怎么办?您在上面的语句中将 header = None 之类的参数放在哪里?
【问题讨论】:
-
您可以使用
functools.partial或将read_csv包装在一个lambda 函数中,例如lambda x: pd.read_csv(x, header=None)。也值得了解map的作用 -
列表理解也有效:
df = pd.concat([pd.read_csv(f, header=None) for f in filepaths]) -
@Yo_Chris 好的,但我在某处读到使用列表对内存使用有很大影响。这是真的还是我弄错了?
-
@SBurggraaff 列表可能会对内存产生很大影响,但情况并非总是如此,尤其是列表理解:stackoverflow.com/questions/1247486/list-comprehension-vs-map。此外,我刚刚计算了
map和 6000 个 csv 文件的列表理解之间的差异,而列表理解实际上更快。列表理解:16 s ± 532 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)地图:16.2 s ± 329 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) -
@Yo_Chris 好的,再次感谢您提供的所有信息。它又回到了使用列表。我查找了一些我从找到的示例中编写的两年前的代码。原来我正在将数据框添加到列表中,然后在 pd.concat 函数中使用该列表。事后看来,当您的数据框变得非常大时,这看起来很愚蠢。顺便说一下,列表推导式看起来非常干净整洁。
标签: python pandas csv concatenation