如何使用python pandas多处理合并两个csv文件

时间:2016-07-14 14:00:03

标签: python pandas multiprocessing

我想使用python panda将两个csv文件与common列合并  使用2 gb内存后的32位处理器会导致内存错误 我怎么能用多处理或任何其他方法做同样的事情

import gc
import pandas as pd
csv1_chunk = pd.read_csv('/home/subin/Desktop/a.txt',dtype=str, iterator=True, chunksize=1000)
csv1 = pd.concat(csv1_chunk, axis=1, ignore_index=True)
csv2_chunk = pd.read_csv('/home/subin/Desktop/b.txt',dtype=str, iterator=True, chunksize=1000)
csv2 = pd.concat(csv2_chunk, axis=1, ignore_index=True)
new_df = csv1[csv1["PROFILE_MSISDN"].isin(csv2["L_MSISDN"])]
new_df.to_csv("/home/subin/Desktop/apyb.txt", index=False)
gc.collect()

请帮我解决这个问题

提前致谢

1 个答案:

答案 0 :(得分:0)

我认为您只需要第二个文件中的一列(实际上,只需要此列中的唯一元素),因此无需加载整个数据框。

import pandas as pd

csv2 = pd.read_csv('/home/subin/Desktop/b.txt', usecols=['L_MSISDN'])
unique_msidns = set(csv2['L_MSISDN'])

如果仍然出现内存错误,请尝试以块的形式执行此操作:

chunk_reader = pd.read_csv('/home/subin/Desktop/b.txt', usecols=['L_MSISDN'], chunksize=1000)
unique_msidns = set()
for chunk in chunk_reader:
    unique_msidns = unique_msidns | set(chunk['L_MSIDNS'])

现在,我们可以处理第一个数据框。

chunk_reader = pd.read_csv('/home/subin/Desktop/a.txt', chunksize=1000)
for chunk in chunk_reader:
    bool_idx = chunk['PROFILE_MSISDN'].isin(unique_msidns)
    # *append* selected lines from every chunk to a file (mode='a')
    # col names are not written
    chunk[bool_idx].to_csv('output_file', header=False, index=False, mode='a')

如果您需要将列名写入输出文件,则可以使用第一个块(我为了代码清晰而跳过它)。

我相信增加chunksize安全(并且可能更快)。

我没有测试过这段代码,所以一定要仔细检查一下。