我想使用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()
请帮我解决这个问题
提前致谢
答案 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
安全(并且可能更快)。
我没有测试过这段代码,所以一定要仔细检查一下。