寫(xiě)程序這方面,自己不是科班出身,本科時(shí)唯一的C語(yǔ)言課也沒(méi)有好好聽(tīng)講。導(dǎo)致后來(lái)寫(xiě)代碼的時(shí)候十分不規(guī)范,也缺失了許多細(xì)節(jié),日常遇到的自己給自己挖的坑還是有必要記錄一下,方便以后復(fù)盤(pán)。
就像現(xiàn)在,前腳寫(xiě)完的代碼后腳就忘了怎么寫(xiě)了……
這段代碼主要是處理了一下打文件讀取過(guò)程中內(nèi)存不夠的問(wèn)題,中間也對(duì)DataFrame進(jìn)行了一系列操作,結(jié)果具體的操作怎么實(shí)現(xiàn)的自己已經(jīng)不記得了……目前還沒(méi)調(diào)試好。
import pandas as pd
import numpy as np
import gc
import os
feature = ['111,222,333,444',
'111,222,333,444',
'111,222,333,444',
'111,222,333,444',
'111,222,333,444',
'111,222,333,444']
dict_in = {'111':'yiyiyi','222':'ererer','333':'sjsjsj','444':'sisisi'}
df = pd.DataFrame(feature,columns=['test'])
def batch_in(df_in,batch,dict_in,str_in='test'):
'''分批傳入,寫(xiě)出,處理數(shù)據(jù),清理內(nèi)存,從硬盤(pán)讀取,輸出'''
if os.path.isfile('test_tmp.csv'):
os.remove('test_tmp.csv')
for i in range(1,df_in.shape[0]//batch):
#Pandas擴(kuò)列操作
df_tmp = df_in[str_in][batch*(i-1):batch*i].str.split(',',expand=True)
for j in df_tmp.columns:
df_tmp[j] = df_tmp[j].map(dict_in)
df_tmp.to_csv('test_tmp.csv',mode='a',header=False,index=0)
del df_tmp
gc.collect()
df_tmp = df_in[str_in][batch*(df_in.shape[0]//batch-1):].str.split(',',expand=True)
for j in df_tmp.columns:
df_tmp[j] = df_tmp[j].map(dict_in)
df_tmp.to_csv('test_tmp.csv',mode='a',header=False,index=0)
del df_tmp
gc.collect()
df_out = []
with open('test_tmp.csv','r') as f:
for line in f:
df_out.append(line.strip())
return df_out
df_out = batch_in(df,1,dict_in)
- DataFrame中對(duì)字符串列進(jìn)行擴(kuò)列時(shí)可以使用
df['column'].str.split(',',expand=True)的方法來(lái)根據(jù)間隔類(lèi)型來(lái)處理,但這本質(zhì)是Series的方法,DataFrame中只能針對(duì)列來(lái)操作; - DataFrame中想要改變單元格中的值可以使用
df.map(dict)的方法,傳入一個(gè)字典來(lái)實(shí)現(xiàn)修改內(nèi)容的映射; - 使用batch對(duì)python對(duì)象進(jìn)行切片時(shí)注意最后一部分的遺留問(wèn)題;
- 手動(dòng)釋放內(nèi)存時(shí)逐次執(zhí)行
del a;gc.collect(); - 可以
df.to_csv(mode='a',header=False)來(lái)完成內(nèi)容追加,注意同時(shí)指定header=False來(lái)確保不打印表頭;