누락 된 값이있는 경우 pandas 데이터 프레임 문자열 열을 소문자로 지정하는 방법은 무엇입니까?


84

다음 코드는 작동하지 않습니다.

import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan],columns=['x']) 
xLower = df["x"].map(lambda x: x.lower())

xLower = [ 'one', 'two', np.nan]을 얻으려면 어떻게 조정해야합니까? 실제 데이터 프레임이 크기 때문에 효율성이 중요합니다.


v0.25부터는 str.casefold보다 적극적인 대소 문자 접기 문자열 비교를 권장 합니다. 이 답변에 대한 자세한 정보 .
cs95

답변:


180

pandas 벡터화 된 문자열 메서드를 사용 합니다 . 문서에서와 같이 :

이 방법은 누락 / NA 값을 자동으로 제외합니다.

.str.lower() 첫 번째 예입니다.

>>> df['x'].str.lower()
0    one
1    two
2    NaN
Name: x, dtype: object

흥미롭게도이 다른 대답지도 방법보다 느리지 10000 loops, best of 3: 96.4 µs per loop10000 loops, best of 3: 125 µs per loop
EdChum

1
@EdChum은 단 3 개의 요소로 놀랍지 않습니다. 그러나 100 개의 요소 만있는 경우는 그렇지 않습니다.
behzad.nouri 2014 년

@ behzad.nouri df1 [ 'comment'] = df1 [ 'comment']. str.lower () 시도했지만 KeyError : 'comment'everythime 오류가 발생했습니다. 확인했습니다-exaclty라는 열이 있습니다. 오류의 원인은 무엇입니까?
Katya

16

열에 문자열뿐만 아니라 숫자도있는 경우 다른 가능한 해결책은 사용 astype(str).str.lower()하거나 to_string(na_rep='')그렇지 않으면 숫자가 문자열이 아니므로 낮추면을 반환 NaN하므로 다음을 반환합니다 .

import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan,2],columns=['x']) 
xSecureLower = df['x'].to_string(na_rep='').lower()
xLower = df['x'].str.lower()

다음 우리는 :

>>> xSecureLower
0    one
1    two
2   
3      2
Name: x, dtype: object

그리고 아닙니다

>>> xLower
0    one
1    two
2    NaN
3    NaN
Name: x, dtype: object

편집하다:

NaN을 잃지 않으려면 맵을 사용하는 것이 더 좋을 것입니다 (@ wojciech-walczak 및 @ cs95 주석에서). 다음과 같이 보일 것입니다.

xSecureLower = df['x'].map(lambda x: x.lower() if isinstance(x,str) else x)

1
고마워요! NaN을 잊어 버렸습니다. 방금 답을 고쳤습니다
Mike W

7

가능한 해결책 :

import pandas as pd
import numpy as np

df=pd.DataFrame(['ONE','Two', np.nan],columns=['x']) 
xLower = df["x"].map(lambda x: x if type(x)!=str else x.lower())
print (xLower)

결과 :

0    one
1    two
2    NaN
Name: x, dtype: object

그래도 효율성에 대해서는 확실하지 않습니다.


다른 답변 isinstance과 마찬가지로 객체의 유형을 확인할 때 사용 하십시오.
cs95

6

이것도 시도해 볼 수 있습니다.

df= df.applymap(lambda s:s.lower() if type(s) == str else s)

1
type(s) == str대신isinstance(s, str)
cs95

6

Pandas> = 0.25 : 대소 문자 구분 제거 str.casefold

v0.25부터 str.casefold유니 코드 데이터를 처리 하는 경우 "벡터화 된"문자열 메서드를 사용하는 것이 좋습니다 (문자열 또는 유니 코드에 관계없이 작동 함).

s = pd.Series(['lower', 'CAPITALS', np.nan, 'SwApCaSe'])
s.str.casefold()

0       lower
1    capitals
2         NaN
3    swapcase
dtype: object

관련 GitHub 문제 GH25405 도 참조 하세요 .

casefold보다 공격적인 대소 문자 구분 비교에 적합합니다. 또한 NaN을 정상적으로 처리합니다 str.lower.

그러나 이것이 더 나은 이유는 무엇입니까?

차이는 유니 코드에서 볼 수 있습니다. 파이썬 str.casefold문서 의 예를 들어 ,

케이스 폴딩은 소문자와 유사하지만 문자열에서 모든 대소 문자 구분을 제거하기위한 것이므로 더 공격적입니다. 예를 들어, 독일어 소문자 'ß'"ss". 이미 소문자이므로 lower()아무것도하지 않습니다 'ß'; casefold() 그것을 "ss".

의 출력을 비교 lower, 대한을

s = pd.Series(["der Fluß"])
s.str.lower()

0    der fluß
dtype: object

casefold,

s.str.casefold()

0    der fluss
dtype: object

또한 Python : lower () vs. casefold () in string matching 및 converting to lowercase를 참조하십시오 .


2

목록 이해력을 사용할 수 있습니다.

import pandas as pd
import numpy as np
df=pd.DataFrame(['ONE','Two', np.nan],columns=['Name']})
df['Name'] = [str(i).lower() for i in df['Name']] 

print(df)

2

람다 함수 적용

df['original_category'] = df['original_category'].apply(lambda x:x.lower())

1

적용 기능 사용,

Xlower = df['x'].apply(lambda x: x.upper()).head(10) 

1
효율성은 사용자에게 중요하고 (Efficiency is important since the real data frame is huge.)답변이 몇 개 더 있으므로 어떤 것이 답변의 좋은 점인지 노출 해주세요.
David García Bodego

0

Dataframe 열을 복사하고 간단히 적용하십시오.

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