为什么DataFrame的级联速度会指数级地慢下来?

我有一个处理DataFrame的函数,主要用于将数据处理到存储桶中,在特定的列中创建一个二进制的特性矩阵。pd.get_dummies(df[col]).

为了避免一次使用此函数(内存不足并导致IPython崩溃)处理所有数据,我使用以下方法将大型DataFrame分解为块:

chunks = (len(df) / 10000) + 1df_list = np.array_split(df, chunks)

pd.get_dummies(df)的内容自动创建新列。df[col]而且这两种方法可能各不相同。df在……里面df_list.

处理后,我将DataFrames连接回一起,使用:

for i, df_chunk in enumerate(df_list):
    print "chunk", i    [x, y] = preprocess_data(df_chunk)
    super_x = pd.concat([super_x, x], axis=0)
    super_y = pd.concat([super_y, y], axis=0)
    print datetime.datetime.utcnow()

第一个块的处理时间是完全可以接受的,但是,每个块都会增长!这与preprocess_data(df_chunk)因为它没有理由增加。这是否是由于调用pd.concat()?

请参阅下面的日志:

chunks 6chunk 02016-04-08 00:22:17.728849chunk 12016-04-08 00:22:42.387693 chunk 22016-04-08 00:23:43.124381chunk 
32016-04-08 00:25:30.249369chunk 42016-04-08 00:28:11.922305chunk 52016-04-08 00:32:00.357365

有办法加快速度吗?我有2900块要处理,所以任何帮助都是非常感谢的!

可以接受Python中的任何其他建议!


catspeake
浏览 953回答 2
2回答

慕神8447489

每次连接时,都会返回数据的副本。您希望保留块的列表,然后将所有内容连接起来作为最后一步。df_x = []df_y = []for i, df_chunk in enumerate(df_list):     print "chunk", i    [x, y] = preprocess_data(df_chunk)     df_x.append(x)     df_y.append(y)super_x = pd.concat(df_x, axis=0)del df_x  # Free-up memory.super_y = pd.concat(df_y, axis=0)del df_y  # Free-up memory.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python