我有多个.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秒内完成所有处理。
但我需要尽快处理所有文件。有没有更好的方法呢?
答案 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列然后过滤它会有帮助吗?还有一个条件比另一个条件强吗?这听起来像是一个内存管理问题而非计算问题。