이전에 질문 한이 질문 과 정신적으로 유사한 질문이 있습니다. 그럼에도 불구하고 적절한 해결책을 찾을 수없는 것 같습니다.
입력 : CSV 데이터가 있습니다.
id,prescriber_last_name,prescriber_first_name,drug_name,drug_cost
1000000001,Smith,James,AMBIEN,100
1000000002,Garcia,Maria,AMBIEN,200
1000000003,Johnson,James,CHLORPROMAZINE,1000
1000000004,Rodriguez,Maria,CHLORPROMAZINE,2000
1000000005,Smith,David,BENZTROPINE MESYLATE,1500
산출물 : 이것에서 나는 단순히 각 약물, 모든 처방전에 대해 합산 된 총 비용을 산출하고 고유 한 처방 자의 수를 가져와야합니다.
drug_name,num_prescriber,total_cost
AMBIEN,2,300.0
CHLORPROMAZINE,2,3000.0
BENZTROPINE MESYLATE,1,1500.0
나는 이것을 파이썬으로 꽤 쉽게 할 수 있었다. 그러나 훨씬 더 큰 (1GB) 입력으로 코드를 실행하려고하면 코드가 적절한 시간 내에 종료되지 않습니다.
import sys, csv
def duplicate_id(id, id_list):
if id in id_list:
return True
else:
return False
def write_file(d, output):
path = output
# path = './output/top_cost_drug.txt'
with open(path, 'w', newline='') as csvfile:
fieldnames = ['drug_name', 'num_prescriber', 'total_cost']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for key, value in d.items():
print(key, value)
writer.writerow({'drug_name': key, 'num_prescriber': len(value[0]), 'total_cost': sum(value[1])})
def read_file(data):
# TODO: https://codereview.stackexchange.com/questions/88885/efficiently-filter-a-large-100gb-csv-file-v3
drug_info = {}
with open(data) as csvfile:
readCSV = csv.reader(csvfile, delimiter=',')
next(readCSV)
for row in readCSV:
prescriber_id = row[0]
prescribed_drug = row[3]
prescribed_drug_cost = float(row[4])
if prescribed_drug not in drug_info:
drug_info[prescribed_drug] = ([prescriber_id], [prescribed_drug_cost])
else:
if not duplicate_id(prescriber_id, drug_info[prescribed_drug][0]):
drug_info[prescribed_drug][0].append(prescriber_id)
drug_info[prescribed_drug][1].append(prescribed_drug_cost)
else:
drug_info[prescribed_drug][1].append(prescribed_drug_cost)
return(drug_info)
def main():
data = sys.argv[1]
output = sys.argv[2]
drug_info = read_file(data)
write_file(drug_info, output)
if __name__ == "__main__":
main()
나는 더 큰 입력을 처리하기 위해 이것을 리팩토링하는 방법을 알아내는 데 어려움을 겪고 있으며 누군가가이 문제를 해결하는 방법에 대한 몇 가지 제안을 할 수 있기를 바랍니다.
팬더를 사용할 수 있다면 다음을 시도하십시오. Pandas는 파일을 읽고 데이터 프레임에 저장합니다. 반복자를 사용하는 수동 파일 처리보다 훨씬 빠릅니다.
import pandas as pd
df = pd.read_csv('sample_data.txt')
columns = ['id','drug_name','drug_cost']
df1 = df[columns]
gd = df1.groupby('drug_name')
cnt= gd.count()
s=gd.sum()
out = s.join(cnt,lsuffix='x')
out['total_cost']=out['drug_costx']
out['num_prescriber']=out['drug_cost']
fout = out[['num_prescriber','total_cost']]
fout.to_csv('out_data.csv')
다음 출력이 표시됩니다.
drug_name,num_prescriber,total_cost
AMBIEN,2,300
BENZTROPINE MESYLATE,1,1500
CHLORPROMAZINE,2,3000
도움이 되었기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다