programing

팬더에서 공백 값(공백)을 NaN으로 대체

copysource 2022. 9. 29. 22:47
반응형

팬더에서 공백 값(공백)을 NaN으로 대체

Panda 데이터 프레임에서 공백(임의의 양)을 포함하는 모든 값을 찾고 해당 값을 NaN으로 대체합니다.

어떻게 개선할 수 있는지 생각나는 거 없어?

기본적으로는, 이것을 전환하고 싶다.

                   A    B    C
2000-01-01 -0.532681  foo    0
2000-01-02  1.490752  bar    1
2000-01-03 -1.387326  foo    2
2000-01-04  0.814772  baz     
2000-01-05 -0.222552         4
2000-01-06 -1.176781  qux     

이 경우:

                   A     B     C
2000-01-01 -0.532681   foo     0
2000-01-02  1.490752   bar     1
2000-01-03 -1.387326   foo     2
2000-01-04  0.814772   baz   NaN
2000-01-05 -0.222552   NaN     4
2000-01-06 -1.176781   qux   NaN

아래 코드로 간신히 해냈는데, 남자답지 않군.그것은 피토닉이 아니고 나는 그것이 판다의 가장 효율적인 사용법도 아니라고 확신한다.각 열을 루프하여 공백에서 각 값을 정규식으로 검색하는 함수를 적용하여 생성된 열 마스크에 대해 부울 치환을 수행합니다.

for i in df.columns:
    df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None

빈 문자열을 포함할 수 있는 필드를 반복하는 것만으로 조금 최적화할 수 있습니다.

if df[i].dtype == np.dtype('object')

하지만 그건 별로 나아진 게 없어

마지막으로, 이 코드는 대상 문자열을 없음으로 설정합니다. 이 코드는 다음과 같은 판다의 함수와 함께 작동합니다.fillna()하지만, 제가 실제로 삽입할 수 있다면 완성도를 위해 좋을 것입니다.NaN대신 직접None.

생각합니다df.replace()팬더 0.13이 되니까요.

df = pd.DataFrame([
    [-0.532681, 'foo', 0],
    [1.490752, 'bar', 1],
    [-1.387326, 'foo', 2],
    [0.814772, 'baz', ' '],     
    [-0.222552, '   ', 4],
    [-1.176781,  'qux', '  '],         
], columns='A B C'.split(), index=pd.date_range('2000-01-01','2000-01-06'))

# replace field that's entirely space (or empty) with NaN
print(df.replace(r'^\s*$', np.nan, regex=True))

작성:

                   A    B   C
2000-01-01 -0.532681  foo   0
2000-01-02  1.490752  bar   1
2000-01-03 -1.387326  foo   2
2000-01-04  0.814772  baz NaN
2000-01-05 -0.222552  NaN   4
2000-01-06 -1.176781  qux NaN

테맥이 지적한 대로df.replace(r'^\s+$', np.nan, regex=True)유효한 데이터에 공백이 포함되어 있는 경우.

빈 문자열과 레코드를 공백으로만 바꾸는 경우 정답은 다음과 같습니다.

df = df.replace(r'^\s*$', np.nan, regex=True)

인정된 답변

df.replace(r'\s+', np.nan, regex=True)

빈 문자열은 대체되지 않습니다.예시를 약간 업데이트하여 직접 사용해 볼 수 있습니다.

df = pd.DataFrame([
    [-0.532681, 'foo', 0],
    [1.490752, 'bar', 1],
    [-1.387326, 'fo o', 2],
    [0.814772, 'baz', ' '],     
    [-0.222552, '   ', 4],
    [-1.176781,  'qux', ''],         
], columns='A B C'.split(), index=pd.date_range('2000-01-01','2000-01-06'))

또한 'fo o'는 공백이 포함되지만 Nan으로 대체되지 않습니다.또한 다음과 같은 간단한 사항도 있습니다.

df.replace(r'', np.NaN)

이것도 안 돼요. 한번 써보세요.

그럼 어떻게 해?

d = d.applymap(lambda x: np.nan if isinstance(x, basestring) and x.isspace() else x)

applymap함수는 데이터 프레임의 모든 셀에 함수를 적용합니다.

나는 이렇게 했다:

df = df.apply(lambda x: x.str.strip()).replace('', np.nan)

또는

df = df.apply(lambda x: x.str.strip() if isinstance(x, str) else x).replace('', np.nan)

모든 str을 제거하고 빈 str을 다음과 같이 대체할 수 있습니다.np.nan.

CSV 파일에서 데이터를 내보내는 경우 다음과 같이 간단하게 할 수 있습니다.

df = pd.read_csv(file_csv, na_values=' ')

이렇게 하면 데이터 프레임이 생성되고 공백 값이 Na로 바뀝니다.

가장 심플한 솔루션:

df = df.replace(r'^\s+$', np.nan, regex=True)

단일 값과 동등성을 확인하는 매우 빠르고 간단한 솔루션에서는mask방법.

df.mask(df == ' ')
print(df.isnull().sum()) # check numbers of null value in each column

modifiedDf=df.fillna("NaN") # Replace empty/null values with "NaN"

# modifiedDf = fd.dropna() # Remove rows with empty values

print(modifiedDf.isnull().sum()) # check numbers of null value in each column

이것들은 모두 정답에 가깝지만, 다른 사람들이 당신의 코드를 읽을 수 있도록 하면서 문제를 해결한다고는 말할 수 없습니다.그 답변은 BrenBarn의 답변과 그 답변 아래에 있는 Tuomasttik의 코멘트를 조합한 것입니다.BrenBarn의 답변은isspaceOP 요청대로 빈 문자열 삭제는 지원되지 않습니다.또한 문자열을 null로 대체하는 표준 사용 사례로 간주합니다.

가 ' 낫다'로 다시 요..applypd.Series ★★★★★★★★★★★★★★★★★」pd.DataFrame.


Python 3:

빈 문자열 또는 공백 문자열 전체를 바꾸려면:

df = df.apply(lambda x: np.nan if isinstance(x, str) and (x.isspace() or not x) else x)

공백 문자열 전체를 바꾸려면:

df = df.apply(lambda x: np.nan if isinstance(x, str) and x.isspace() else x)

2에서 Python 2를 대체해야 .strbasestring.

Python 2:

빈 문자열 또는 공백 문자열 전체를 바꾸려면:

df = df.apply(lambda x: np.nan if isinstance(x, basestring) and (x.isspace() or not x) else x)

공백 문자열 전체를 바꾸려면:

df = df.apply(lambda x: np.nan if isinstance(x, basestring) and x.isspace() else x)

이건 나한테 효과가 있었어.csv 파일을 Import할 때 na_values = '를 추가했습니다. 공백은 기본 NaN 값에 포함되지 않습니다.

df= pd.read_csv(filepath,na_values = ' ')

이것은 우아한 솔루션은 아니지만 XLSX에 저장한 후 다시 Import하는 것이 효과적이라고 생각됩니다.이 페이지의 다른 솔루션은 왜 그런지 확실하지 않아 제대로 작동하지 않았습니다.

data.to_excel(filepath, index=False)
data = pd.read_excel(filepath)

이거면 될 것 같아

df.loc[df.Variable == '', 'Variable'] = 'Value'

또는

df.loc[df.Variable1 == '', 'Variable2'] = 'Value'

필터를 사용하여 할 수도 있습니다.

df = PD.DataFrame([
    [-0.532681, 'foo', 0],
    [1.490752, 'bar', 1],
    [-1.387326, 'foo', 2],
    [0.814772, 'baz', ' '],     
    [-0.222552, '   ', 4],
    [-1.176781,  'qux', '  '])
    df[df=='']='nan'
    df=df.astype(float)

언급URL : https://stackoverflow.com/questions/13445241/replacing-blank-values-white-space-with-nan-in-pandas

반응형