我正在使用包含 5 列和超过 9000 万行的庞大数据集。该代码可以很好地处理部分数据,但是当涉及到全部数据时,我会遇到内存错误。我阅读了有关生成器的信息,但对我来说它似乎非常复杂。我可以根据这段代码得到解释吗?
df = pd.read_csv('D:.../test.csv', names=["id_easy","ordinal", "timestamp", "latitude", "longitude"])
df = df[:-1]
df.loc[:,'timestamp'] = pd.to_datetime(df.loc[:,'timestamp'])
pd.set_option('float_format', '{:f}'.format)
df['epoch'] = df.loc[:, 'timestamp'].astype('int64')//1e9
df['day_of_week'] = pd.to_datetime(df['epoch'], unit="s").dt.weekday_name
del df['timestamp']
for day in ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']:
day_df = df.loc[df['day_of_week'] == day]
day_df.to_csv(f'{day}.csv', index=False,)
最后一个for循环
操作出现错误
示例数据:
d4ace40905729245a5a0bc3fb748d2b3 1 2016-06-01T08:18:46.000Z 22.9484 56.7728
d4ace40905729245a5a0bc3fb748d2b3 2 2016-06-01T08:28:05.000Z 22.9503 56.7748
已更新
我这样做了:
chunk_list = []
for chunk in df_chunk:
chunk_list.append(chunk)
df_concat = pd.concat(chunk_list)
我现在不知道如何进行?如何应用其余代码?
最佳答案
如果您想继续使用 pandas,请尝试以下提示来读取 CSV 文件,使用 pandas.read_csv :
chunksize
参数:允许您一次读取一个文件。为了 例如,在您的情况下,您可以使用等于一百万的 block 大小,您 会得到 90 个 block ,你可以对每个 block 进行操作 单独。dtype
参数:使用此参数,您只需传递一个字典即可指定每一列的数据类型:{'a': np.float32, 'b': np .int32, 'c': 'Int32'}
Pandas 可以使用 64 位数据类型,而 32 位可能就足够了。使用此技巧,您可以节省 50% 的空间。
您的案例研究
试试这个代码:
df_chunks = pd.read_csv('test.csv', chunksize=1000000, iterator=True,
parse_dates=['timestamp'], error_bad_lines=False,
dtype={"ordinal":'int32', "latitude": 'float32', "longitude":'float32'})
for chunk in df_chunks:
# chunk = chunk.apply(...) # process the single chunk
for day in ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']:
day_df = chunk.loc[chunk['day_of_week'] == day]
day_df.to_csv(f'{day}.csv', mode='a', index=0, header=False)
通过这种方式,您一次可以处理一大块数据,而无需同时处理所有数据。 mode='a'
告诉 pandas 追加。
注1:
此处不需要 pandas.concat
。 iterator 和 chunksize=1000000
唯一做的就是给你一个读取器对象, iterates 1000000 行数据帧,而不是读取整个内容。使用 concat 你失去了使用 iterators 和将整个文件加载到内存中的所有优势,就像使用 csv 法则而不指定 block 大小一样。
注意 2:如果 'MemoryError'
错误仍然存在,请尝试更小的 block 大小。
关于python - 如何减少内存使用并加快代码速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58157958/