[python] 데이터 프레임의 모든 문자열 제거 / 자르기

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처럼 dictslists자신 때문에 dtypesIS 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)


답변