Pandas,只读取目录中所有pickle文件的长度



我用下面的代码读取了一堆pickle文件,我想循环并获得每个文件,确定每个文件的长度。有多少条记录

两个问题:

  1. Concat将把我所有的dfs合并为一个,这需要很长时间。有人看一下镜头吗?
  2. 如果Concat是要走的路,我怎么能得到每个文件的长度,如果他们都进入一个数据帧?我想问题是在这里确定每个文件在哪里停止和开始。我可以添加一列来标识每个文件名,并在那里计数。

我试过了:

import pandas as pd
import glob, os

files = glob.glob('O:StackOverFlow*.pkl')
df = pd.concat([pd.read_pickle(fp, compression='xz').assign(New=os.path.basename(fp)) for fp in files])

如有任何帮助,不胜感激。

先添加到列表后添加。由于二次复制导致的附加或连接在for循环内的不良影响。

import pandas as pd
import glob, os
files = glob.glob('O:StackOverFlow*.pkl')
dfs = []
for fp in files:
df = pd.read_pickle(fp, compression='xz').assign(New=os.path.basename(fp)) 
dfs.append(df)
# or as @G.Anderson points out maybe
dfs.append(len(df))
pd.concat(dfs)

如果您只想要单个数据帧的长度,那么对concat的调用是完全不必要的开销。为了重新定义您自己的代码,您已经从文件中构建了数据框架,您可以只使用它们来捕获长度。

import pandas as pd
import glob, os

files = glob.glob('O:StackOverFlow*.pkl')
#a call to assign should also be irrelevant because adding a column doesn't change the length
lens=[len(pd.read_pickle(fp, compression='xz')) for fp in files]

或者如果你想保存文件名的字典,长度应该是这样的:

lens = {os.path.basename(fp):len(pd.read_pickle(fp, compression='xz')) for fp in files}

最新更新