python / pandas에서 다중 유형 데이터 프레임의 값을 정리하고 문자열을 자르고 싶습니다. 현재 두 가지 지침으로 수행하고 있습니다.
import pandas as pd
df = pd.DataFrame([[' a ', 10], [' c ', 5]])
df.replace('^\s+', '', regex=True, inplace=True) #front
df.replace('\s+$', '', regex=True, inplace=True) #end
df.values
이것은 매우 느립니다. 무엇을 개선 할 수 있습니까?
답변
를 사용 DataFrame.select_dtypes
하여 string
열을 선택한 다음 apply
기능 할 수 있습니다 str.strip
.
주의 : 값이 될 수 없다 types
처럼 dicts
나 lists
자신 때문에 dtypes
IS object
.
df_obj = df.select_dtypes(['object'])
print (df_obj)
0 a
1 c
df[df_obj.columns] = df_obj.apply(lambda x: x.str.strip())
print (df)
0 1
0 a 10
1 c 5
그러나 몇 개의 열만 사용하는 경우 str.strip
:
df[0] = df[0].str.strip()
답변
머니 샷
다음 은 값이 문자열 유형 인 경우에만 applymap
호출하기 위해 간단한 람다 식과 함께 사용하는 간단한 버전입니다 strip
.
df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
전체 예
더 완전한 예 :
import pandas as pd
def trim_all_columns(df):
"""
Trim whitespace from ends of each value across all series in dataframe
"""
trim_strings = lambda x: x.strip() if isinstance(x, str) else x
return df.applymap(trim_strings)
# simple example of trimming whitespace from data elements
df = pd.DataFrame([[' a ', 10], [' c ', 5]])
df = trim_all_columns(df)
print(df)
>>>
0 1
0 a 10
1 c 5
작업 예
다음은 trinket에서 호스팅하는 작업 예제입니다.
https://trinket.io/python3/e6ab7fb4ab
답변
당신은 시도 할 수 있습니다:
df[0] = df[0].str.strip()
또는 더 구체적으로 모든 문자열 열에 대해
non_numeric_columns = list(set(df.columns)-set(df._get_numeric_data().columns))
df[non_numeric_columns] = df[non_numeric_columns].apply(lambda x : str(x).strip())
답변
정말 정규식을 사용하려면
>>> df.replace('(^\s+|\s+$)', '', regex=True, inplace=True)
>>> df
0 1
0 a 10
1 c 5
그러나 다음과 같이하는 것이 더 빠릅니다.
>>> df[0] = df[0].str.strip()
답변
개체 의 apply
기능 을 사용할 수 있습니다 Series
.
>>> df = pd.DataFrame([[' a ', 10], [' c ', 5]])
>>> df[0][0]
' a '
>>> df[0] = df[0].apply(lambda x: x.strip())
>>> df[0][0]
'a'
훨씬 빠른 것이
strip
아니라 사용법에 유의하십시오.regex
또 다른 옵션 -DataFrame 개체 의 apply
기능 을 사용 합니다.
>>> df = pd.DataFrame([[' a ', 10], [' c ', 5]])
>>> df.apply(lambda x: x.apply(lambda y: y.strip() if type(y) == type('') else y), axis=0)
0 1
0 a 10
1 c 5
답변
def trim(x):
if x.dtype == object:
x = x.str.split(' ').str[0]
return(x)
df = df.apply(trim)