팬더에서 공백 값(공백)을 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의 답변은isspace
OP 요청대로 빈 문자열 삭제는 지원되지 않습니다.또한 문자열을 null로 대체하는 표준 사용 사례로 간주합니다.
가 ' 낫다'로 다시 요..apply
pd.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를 대체해야 .str
basestring
.
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
'programing' 카테고리의 다른 글
스토어드 프로시저를 사용하여 합산, 그룹화 및 다른 표에 삽입하기 (0) | 2022.09.29 |
---|---|
python 코드에서 셸 스크립트를 호출하는 방법 (0) | 2022.09.29 |
ajax의 시간 초과 설정(jQuery) (0) | 2022.09.29 |
matplotlib를 사용하여 while loop에서 실시간 플롯을 작성하려면 어떻게 해야 합니까? (0) | 2022.09.29 |
MySQL은 중복된 레코드를 삭제하지만 최신 상태로 유지합니다. (0) | 2022.09.29 |