3
일반적인 SQL은 "A로 테이블 그룹에서 A를 선택하십시오."이며 일반적인 팬더에서 이것을 복제하고 싶습니다. 데이터가 CSV 파일과 같은 것으로 저장되어 있고 너무 커서 메모리에로드 할 수 없다고 가정합니다. csv로 메모리에 들어갈 수 있다면Pandas GroupBy CSV의 대형 데이터 세트
단순한 2 라이너는 충분 :
data=pandas.read_csv("report.csv")
mean=data.groupby(data.A).mean()
는 CSV 메모리로 읽을 수없는 경우 하나를 시도 할 수 있습니다 :
chunks=pandas.read_csv("report.csv",chunksize=whatever)
cmeans=pandas.concat([chunk.groupby(data.A).mean() for chunk in chunks])
badMeans=cmeans.groupby(cmeans.A).mean()
을 결과 cmeans 것을 제외 테이블에는 A의 각 고유 한 값에 대한 반복 된 항목이 포함되어 있습니다. 하나는 별개의 청크에있는 해당 값의 각 모양에 대한 항목입니다 (read_csv의 chunksize는 그룹화 필드에 대해 아무 것도 모르기 때문에). 결과적으로 최종 badMeans 테이블에 잘못된 대답이 있습니다 ... 가중 평균 평균을 계산해야합니다.
final=pandas.DataFrame({"A":[],"mean":[],"cnt":[]})
for chunk in chunks:
t=chunk.groupby(chunk.A).sum()
c=chunk.groupby(chunk.A).count()
cmean=pandas.DataFrame({"tot":t,"cnt":c}).reset_index()
joined=pandas.concat(final,cmean)
final=joined.groupby(joined.A).sum().reset_indeX()
mean=final.tot/final.cnt
내가 뭔가를 놓치고 있습니까 :
그래서 작업 방식은 같은 것 같다? 이것은 미친 듯이 복잡해 보인다 ... 나는 이것을 다루기보다는 CSV를 한 줄씩 처리하는 for 루프를 작성하려고한다. 더 좋은 방법이 있어야합니다.
감사합니다 확실히 더 나은 ... 전혀 명확하지는 않지만 (그리고 int의 오버플로에 대한 몇 가지 우려가 있습니다.) 바라건대 팬더의 향후 버전이이를 더욱 쉽게 만들어 줄 수 있기를 바랍니다. – user116948
이 문제 참조 : https://github.com/pydata/pandas/issues/3202; 이것은 올바르게하는 것이 사소한 일이 아닙니다. 동기 부여가 된 기여자 만 있습니다! – Jeff
dask가 이제이 문제를 해결합니까? – eleanora