Pandas DataFrame에서 쉼표가있는 숫자 문자열을 부동 소수점으로 변환


88

수천 마커에 대해 쉼표가있는 문자열로 숫자를 포함하는 DataFrame이 있습니다. 나는 그것들을 수레로 변환해야합니다.

a = [['1,200', '4,200'], ['7,000', '-0.03'], [ '5', '0']]
df=pandas.DataFrame(a)

locale.atof를 사용해야한다고 생각합니다. 과연

df[0].apply(locale.atof)

예상대로 작동합니다. 나는 일련의 수레를 얻습니다.

하지만 DataFrame에 적용하면 오류가 발생합니다.

df.apply(locale.atof)

TypeError : ( "시리즈를"로 변환 할 수 없습니다. 인덱스 0에서 발생했습니다. ")

df[0:1].apply(locale.atof)

또 다른 오류가 있습니다.

ValueError : ( 'invalid literal for float () : 1,200', u'occurred at index 0 ')

그렇다면이 DataFrame문자열을 부동의 DataFrame으로 어떻게 변환 합니까?


2
오래된 질문이지만 OP는 applyDataFrame에서 전체 을 함수에 시리즈로 전달 하기 때문에 해당 오류가 발생합니다 (이 경우 locale.atof문자열이 필요합니다). applymap아래 답변에서 @AndyHayden 이하는 방법을 사용하면 잘 할 수 있습니다.
TC Proctor

답변:


144

csv에서 읽는 다면 수천 개의 arg를 사용할 수 있습니다 .

df.read_csv('foo.tsv', sep='\t', thousands=',')

이 방법은 별도의 단계로 작업을 수행하는 것보다 더 효율적일 수 있습니다.


먼저 로케일설정 해야합니다 .

In [ 9]: import locale

In [10]: from locale import atof

In [11]: locale.setlocale(locale.LC_NUMERIC, '')
Out[11]: 'en_GB.UTF-8'

In [12]: df.applymap(atof)
Out[12]:
      0        1
0  1200  4200.00
1  7000    -0.03
2     5     0.00

로케일을 설정했다고 말 했어야했습니다. 여전히 오류가 발생합니다.
pheon

2
하지만 저는 df.read_fwf를 사용하고 있으며 "1000 = ','"옵션도 있습니다. 감사.
pheon

그렇다면 df.applymap (atof)은 왜 당신에게는 작동하지만 나는 작동하지 않습니까? 내 로케일은 'en_US.UTF-8'입니다.
pheon

10
read_csv 함수에 대한 '수천'인수 팁을 위해 이것을 투표했습니다. 그것은 나를 위해 잘 작동했습니다.
rockfakie

3
수레를 다루는 경우 "decimal = ','"도 사용할 수 있다고 덧붙이고 싶었습니다.
VessoVit

32

pandas.Series.str.replace 메소드를 사용할 수 있습니다 .

df.iloc[:,:].str.replace(',', '').astype(float)

이 메서드는 문자열에서 쉼표를 제거하거나 바꿀 수 있습니다.


1
"AttributeError : 'DataFrame'object has no attribute 'str'", 왜 그런지 모르겠습니다 ...
krassowski

1
그러나 이것은 작동합니다 :df.apply(lambda x: x.str.replace(',', '').astype(float), axis=1)
krassowski

21

다음과 같이 한 번에 하나의 열을 변환 할 수 있습니다.

df['colname'] = df['colname'].str.replace(',', '').astype(float)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.