[python] Pandas를 사용하여 데이터 프레임을 저장하는 방법

지금 CSV은 스크립트를 실행할 때마다 상당히 큰 데이터 프레임을 가져 옵니다. 실행 사이에 데이터 프레임을 지속적으로 사용할 수있는 좋은 솔루션이 있습니까? 그래서 스크립트 실행을 기다리는 데 시간을 할애 할 필요가 없습니까?



답변

가장 쉬운 방법은 다음을 사용하여 피클 하는 것입니다 to_pickle.

df.to_pickle(file_name)  # where to save it, usually as a .pkl

그런 다음 다음을 사용하여 다시로드 할 수 있습니다.

df = pd.read_pickle(file_name)

참고 : 0.11.1 이전 saveload이 작업을 수행 할 수있는 유일한 방법 (그들은 지금의 찬성되지 않습니다했다 to_pickleread_pickle각각).


또 다른 대중적인 선택은 대용량 데이터 세트에 매우 빠른 액세스 시간을 제공 하는 HDF5 ( pytables ) 를 사용 하는 것입니다 .

store = HDFStore('store.h5')

store['df'] = df  # save it
store['df']  # load it

더 고급 전략은 요리 책 에서 논의됩니다 .


0.13부터는 JSON보다 빠른 대안으로 또는 파이썬 객체 / 텍스트가 많은 데이터가있는 경우 상호 운용성을 위해 더 나은 msgpack 이 있습니다 ( 이 질문 참조 ).


답변

이미 몇 가지 답변이 있지만 Pandas DataFrames를 효율적 으로 직렬화하는 여러 가지 방법을 시도한 훌륭한 비교를 발견했습니다. 효율적으로 Pandas DataFrames 저장하십시오 .

그들은 다음을 비교합니다.

  • 피클 : 원본 ASCII 데이터 형식
  • cPickle, C 라이브러리
  • pickle-p2 : 최신 이진 형식을 사용합니다
  • json : standardlib json 라이브러리
  • json-no-index : json과 비슷하지만 색인이 없습니다.
  • msgpack : 바이너리 JSON 대안
  • CSV
  • hdfstore : HDF5 저장 형식

실험에서 그들은 개별적으로 테스트 된 두 개의 열 (하나는 텍스트 데이터, 다른 하나는 숫자)로 1,000,000 행의 DataFrame을 직렬화합니다. 그들의 면책 조항은 다음과 같이 말합니다.

다음 내용이 데이터를 일반화한다고 믿지 않아야합니다. 자신의 데이터를보고 벤치 마크를 직접 실행해야합니다.

그들이 참조하는 테스트의 소스 코드는 온라인에서 볼 수 있습니다 . 이 코드가 직접 작동하지 않았기 때문에 약간의 변경 사항을 만들었습니다. serialize.py
다음과 같은 결과를 얻었습니다.

시간 비교 결과

또한 텍스트 데이터를 범주 형 데이터로 변환 하면 직렬화가 훨씬 빠릅니다. 테스트에서 약 10 배 정도 빠릅니다 (테스트 코드 참조).

편집 : CSV보다 피클에 더 많은 시간을 사용 된 데이터 형식으로 설명 할 수 있습니다. 기본적으로 pickle더 큰 데이터 세트를 생성하는 인쇄 가능한 ASCII 표현을 사용합니다. 그러나 그래프에서 볼 수 있듯이 최신 이진 데이터 형식 (버전 2, pickle-p2)을 사용하는 피클 은로드 시간이 훨씬 짧습니다.

다른 참고 문헌들 :


답변

내가 올바르게 이해하고 있다면 이미 사용하고 pandas.read_csv()있지만 스크립트를 편집 할 때마다 파일을로드 할 필요가 없도록 개발 프로세스를 가속화하고 싶습니다. 맞습니까? 몇 가지 권장 사항이 있습니다.

  1. pandas.read_csv(..., nrows=1000)개발하는 동안 테이블의 최상위 비트 만로드하는 데 사용하여 CSV 파일의 일부만로드 할 수 있습니다.

  2. 스크립트를 편집하고 다시로드 할 때 팬더 테이블을 메모리에 유지하도록 대화식 세션에 ipython 을 사용 하십시오.

  3. CSV를 HDF5 테이블 로 변환

  4. 업데이트 된 사용 DataFrame.to_feather()pd.read_feather()데이터를 R- 호환 페더 이진 형식으로 초고속으로 저장합니다 (제 손에는 pandas.to_pickle()숫자 데이터 보다 약간 빠르며 문자열 데이터에서는 훨씬 빠릅니다).

stackoverflow에 대한이 답변 에 관심 있을 수도 있습니다 .


답변

피클은 잘 작동합니다!

import pandas as pd
df.to_pickle('123.pkl')    #to save the dataframe, df to 123.pkl
df1 = pd.read_pickle('123.pkl') #to load 123.pkl back to the dataframe df


답변

페더 형식 파일을 사용할 수 있습니다. 매우 빠릅니다.

df.to_feather('filename.ft')


답변

Pandas DataFrame에는 DataFrame to_pickle을 저장하는 데 유용한 기능이 있습니다.

import pandas as pd

a = pd.DataFrame({'A':[0,1,0,1,0],'B':[True, True, False, False, False]})
print a
#    A      B
# 0  0   True
# 1  1   True
# 2  0  False
# 3  1  False
# 4  0  False

a.to_pickle('my_file.pkl')

b = pd.read_pickle('my_file.pkl')
print b
#    A      B
# 0  0   True
# 1  1   True
# 2  0  False
# 3  1  False
# 4  0  False


답변

이미 언급했듯이 데이터 프레임을 저장하기위한 다양한 옵션 및 파일 형식 ( HDF5 , JSON , CSV , parquet , SQL )이 있습니다. 그러나 다음과 같은 pickle이유로 일급 시민이 아닙니다 (설정에 따라 다름).

  1. pickle잠재적 인 보안 위험입니다. pickle에 대한 Python 문서를 작성하십시오 .

경고pickle 모듈은 잘못된 또는 악의적으로 제작 된 데이터에 대한 보안 상 안전하지 않을 수 있습니다. 신뢰할 수 없거나 인증되지 않은 소스에서받은 데이터를 피클 링하지 마십시오.

  1. pickle느리다. 여기여기에서 벤치 마크를 찾으 십시오 .

설정 / 사용법에 따라 두 제한 사항이 모두 적용되지는 않지만 pickle팬더 데이터 프레임의 기본 지속성으로 권장하지 않습니다 .