如何加快使用.txt文件形成的python数据帧中的搜索/过滤?

时间:2016-12-16 11:33:31

标签: python python-2.7 pandas numpy python-import

我有多个.txt文件。我使用

导入并组合它们以形成python数据框
all_files = glob.glob(os.path.join(path, "*.txt"))

np_array_list = []
for file in all_files:
    df = pd.read_table(file, index_col = None, header = 0)
    np_array_list.append(df.as_matrix())

comb_np_array = np.vstack(np_array_list)
big_frame = pd.DataFrame(comb_np_array)

导入大约20个文件并形成数据框需要大约19秒。有没有更快的方法呢?

其次, 一旦形成数据帧,它就包含~800万行。我需要使用第5列

中值的条件来过滤行

“长度为12的值,它们以'26'开头”

我通过以下代码实现了这一点。

big_frame.columns = ["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"]

big_frame['Five'] = big_frame['Five'].astype('str')

mask = (big_frame['Five'].str.len() == 12) & (big_frame['Five'].str.startswith('26'))

big_frame = big_frame.loc[mask]

需要FOREVER过滤掉符合我条件的所有值。我只用一个.txt文件验证了代码。它在~3秒内完成所有处理。

但我需要尽快处理所有文件。有没有更好的方法呢?

2 个答案:

答案 0 :(得分:1)

一种可能的解决方案是首先过滤,然后是concat,但性能取决于实际数据:

all_files = glob.glob(os.path.join(path, "*.txt"))

dfs = []
for file in all_files:
    df = pd.read_csv(file, index_col = None, header = 0)
    df.columns = ["One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"]
    mask = (df['Five'].str.len() == 12) & (df['Five'].str.startswith('26'))
    dfs.append(df[mask])

big_frame = pd.concat(dfs, ignore_index=True)

答案 1 :(得分:0)

在构建Dataframe时,您似乎正在创建数据帧,然后转换为矩阵然后返回...看看它是否更快可能使用pandas dataframe.append函数(http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.append.html)< / p>

关于第二个主题 - 如果你创建一个len列和前两个char列然后过滤它会有帮助吗?还有一个条件比另一个条件强吗?这听起来像是一个内存管理问题而非计算问题。