Pandas to_csv가있는 float64


88

다음과 같은 부동 숫자가 포함 된 CSV를 읽고 있습니다.

Bob,0.085
Alice,0.005

데이터 프레임으로 가져 와서이 데이터 프레임을 새 위치에 씁니다.

df = pd.read_csv(orig)
df.to_csv(pandasfile)

이제 이것은 다음 pandasfile과 같습니다.

Bob,0.085000000000000006
Alice,0.0050000000000000001

무슨 일이야? 아마도 float32 같은 다른 유형으로 캐스팅해야할까요?

임 사용 팬더 0.9.01.6.2 NumPy와 .


26
부동 소수점 숫자에 오신 것을 환영합니다.
Ignacio Vazquez-Abrams


1
여기에서 좀 더 자세히 조사 할 문제를 만들었습니다. github.com/pydata/pandas/issues/2069 편집 : 가능하다면 문제의 독립 실행 형 재현을 GitHub 문제에 올려주세요. 나는 그것을 재현 할 수 없습니다.
Wes McKinney

답변:


165

주석에서 언급했듯이 일반적인 부동 소수점 문제입니다.

그러나의 float_format키워드 를 사용하여 to_csv숨길 수 있습니다.

df.to_csv('pandasfile.csv', float_format='%.3f')

또는 0.0001을 0으로 반올림하지 않으려면 :

df.to_csv('pandasfile.csv', float_format='%g')

당신에게 줄 것입니다 :

Bob,0.085
Alice,0.005

출력 파일에.

에 대한 설명 %gFormat Specification Mini-Language를 참조하십시오 .


오류가 발생했습니다TypeError: __init__() got an unexpected keyword argument 'float_format'
wander95

누군가 @ wander95와 동일한 오류가있는 경우 pandas최신 버전 으로 업데이트해야 할 수 있습니다.
driftcatcher

10

업데이트 : 답변은 작성 당시 정확했으며 부동 소수점 정밀도는 to_csv / read_csv (정밀 성능 절충, 기본값은 성능 선호)에서 기본적으로 얻는 것이 아닙니다.

요즘이 에 해당하는 인수사용할 인수 .float_formatpandas.DataFrame.to_csvfloat_precisionpandas.from_csv

원본은 여전히 ​​문제를 더 잘 파악하기 위해 읽을 가치가 있습니다.


"to_csv"함수뿐만 아니라 "read_csv"에서도 pandas의 버그였습니다. 부동 소수점 산술 이 프로그래머의주의를 요하는 주제라는 것은 사실 임에도 불구하고 일반적인 부동 소수점 문제는 아닙니다 . 아래의이 기사에서는이 주제에 대해 약간 설명합니다.

http://docs.python.org/2/tutorial/floatingpoint.html

"문제"를 보여주는 고전적인 원 라이너는 ...

>>> 0.1 + 0.1 + 0.1
0.30000000000000004

... 예상대로 0.3을 표시하지 않습니다. 반면에 고정 소수점 산술을 사용하여 계산을 처리하고 마지막 단계에서만 부동 소수점 산술 을 사용 하면 예상대로 작동합니다. 이것 좀 봐:

>>> (1 + 1 + 1)  * 1.0 / 10
0.3

이 문제를 필사적으로 피해야한다면 모든 숫자를 정수로 포함하는 다른 CSV 파일을 만드는 것이 좋습니다. 예를 들어 100, 1000 또는 기타 편리한 요소를 곱하는 것과 같이합니다. 응용 프로그램 내에서 평소와 같이 CSV 파일을 읽으면 해당 정수 수치를 다시 얻을 수 있습니다. 그런 다음 이전에 곱한 것과 동일한 계수로 나눈 값을 부동 소수점으로 변환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.