누락 된 값이있는 경우 pandas 데이터 프레임 열을 소문자로 지정하는 방법은 무엇입니까?
다음 코드는 작동하지 않습니다.
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]을 얻으려면 어떻게해야하나요? 실제 데이터 프레임이 크기 때문에 효율성이 중요합니다.
pandas 벡터화 된 메소드를 사용 합니다 . 문서에서와 같이 :
이 방법은 누락 / NA 값을 자동으로 제외합니다.
.str.lower()
첫 번째 예입니다.
>>> df['x'].str.lower()
0 one
1 two
2 NaN
Name: x, dtype: object
열이 너무 문자열뿐만 아니라 번호를 갖는 경우 , 다른 가능한 해결책은,하는을 구석으로 사용 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)
가능한 해결책 :
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
그래도 효율성에 대해서는 확실하지 않습니다.
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를 참조하십시오 .
이것도 시도해 볼 수 있습니다.
df= df.applymap(lambda s:s.lower() if type(s) == str else s)
List comprehension을 사용할 수 있습니다.
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)
Dataframe 열을 복사하고 간단히 적용하십시오.
df = data [ 'x'] newdf = df.str.lower ()
'ProgramingTip' 카테고리의 다른 글
WebDeploy- 사용자 '. \ WDeployConfigWriter '에 거의 할 수 없습니다. (0) | 2021.01.09 |
---|---|
자바 : 현재 필요한 날짜 형식이 필요한 형식에 맞는지 확인하십시오. (0) | 2021.01.09 |
프로그래밍 방식으로 Android 애플리케이션의 캐시 지우기 (0) | 2021.01.09 |
a 전에 모든 것을 얻는 방법 : in a string Python (0) | 2021.01.09 |
mail 명령을 사용하여 이메일을 보낼 때 보낸 사람을 지정합니다. (0) | 2021.01.09 |