Pandas Data Frame에서 음수를 0으로 대체하는 방법
모든 DataFrame 음수를 0으로 대체할 수 있는 방법이 있는지 알고 싶습니다.
모든 열이 숫자인 경우 부울 인덱싱을 사용할 수 있습니다.
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'a': [0, -1, 2], 'b': [-3, 2, 1]})
In [3]: df
Out[3]:
a b
0 0 -3
1 -1 2
2 2 1
In [4]: df[df < 0] = 0
In [5]: df
Out[5]:
a b
0 0 0
1 0 2
2 2 1
더 일반적인 경우, 이 대답은 개인 방법을 보여줍니다._get_numeric_data
:
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'a': [0, -1, 2], 'b': [-3, 2, 1],
'c': ['foo', 'goo', 'bar']})
In [3]: df
Out[3]:
a b c
0 0 -3 foo
1 -1 2 goo
2 2 1 bar
In [4]: num = df._get_numeric_data()
In [5]: num[num < 0] = 0
In [6]: df
Out[6]:
a b c
0 0 0 foo
1 0 2 goo
2 2 1 bar
와 함께timedelta
유형, 부울 인덱싱은 별도의 열에서 작동하는 것처럼 보이지만 전체 데이터 프레임에서는 작동하지 않습니다.따라서 다음을 수행할 수 있습니다.
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'a': pd.to_timedelta([0, -1, 2], 'd'),
...: 'b': pd.to_timedelta([-3, 2, 1], 'd')})
In [3]: df
Out[3]:
a b
0 0 days -3 days
1 -1 days 2 days
2 2 days 1 days
In [4]: for k, v in df.iteritems():
...: v[v < 0] = 0
...:
In [5]: df
Out[5]:
a b
0 0 days 0 days
1 0 days 2 days
2 2 days 1 days
업데이트: 과의 비교pd.Timedelta
전체 데이터 프레임에서 작동합니다.
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'a': pd.to_timedelta([0, -1, 2], 'd'),
...: 'b': pd.to_timedelta([-3, 2, 1], 'd')})
In [3]: df[df < pd.Timedelta(0)] = 0
In [4]: df
Out[4]:
a b
0 0 days 0 days
1 0 days 2 days
2 2 days 1 days
이것을 하는 또 다른 간단한 방법은 판다입니다.DataFrame.clip.
예:
import pandas as pd
In [20]: df = pd.DataFrame({'a': [-1, 100, -2]})
In [21]: df
Out[21]:
a
0 -1
1 100
2 -2
In [22]: df.clip(lower=0)
Out[22]:
a
0 0
1 100
2 0
제가 유용하다고 생각한 또 다른 깨끗한 선택은 팬더입니다.DataFrame.mask: "조건이 참인 경우 값을 바꿉니다."
데이터 프레임 만들기:
In [2]: import pandas as pd
In [3]: df = pd.DataFrame({'a': [0, -1, 2], 'b': [-3, 2, 1]})
In [4]: df
Out[4]:
a b
0 0 -3
1 -1 2
2 2 1
음수를 0으로 대체:
In [5]: df.mask(df < 0, 0)
Out[5]:
a b
0 0 0
1 0 2
2 2 1
또는 음수를 NaN으로 대체하여 자주 필요합니다.
In [7]: df.mask(df < 0)
Out[7]:
a b
0 0.0 NaN
1 NaN 2.0
2 2.0 1.0
아마도 당신은 사용할 수 있습니다.pandas.where(args)
이와 같이:
data_frame = data_frame.where(data_frame < 0, 0)
람다 함수 포함
df['column'] = df['column'].apply(lambda x : x if x > 0 else 0)
만약 당신이 큰 df(나의 경우 40m x 700)를 다루고 있다면, 그것은 비슷한 것을 가진 열에서 반복함으로써 훨씬 더 빨리 작동하고 메모리에 정통합니다.
for col in df.columns:
df[col][df[col] < 0] = 0
제시된 답변을 약간 수정했습니다.
모든 숫자 열을 식별하고 모든 숫자 값으로 데이터 프레임을 생성합니다.그런 다음 새 데이터 프레임에서 음수 값을 NaN으로 바꿉니다.
df_numeric = df.select_dtypes(include=[np.number])
df_numeric = df_numeric.where(lambda x: x > 0, np.nan)
이제 주 데이터 프레임에서 음수 값이 처리되는 열을 삭제한 다음 새 열 값을 주 데이터 프레임에 연결합니다.
numeric_cols = df_numeric.columns.values
df = df.drop(columns=numeric_cols)
df = pd.concat([df, df_numeric], axis = 1)
데이터 유형이 혼합된 데이터 집합이 있는 경우 숫자가 아닌 데이터를 인덱스로 이동하고 데이터를 업데이트한 다음 인덱스를 제거하는 것도 고려해야 합니다.
df = pd.DataFrame({'a': [0, -1, 2], 'b': [-3, 2, 1],
'c': ['foo', 'goo', 'bar']})
df = df.set_index('c')
df[df < 0] = 0
df = df.reset_index()
다음을 사용한 접근 방식_get_numeric_data()
어떤 이유에선지 저한테는 효과가 없었어요.
사용해 보십시오.
df.loc[(df < 0).index, :] = 0
예측할 수 없는 동작을 방지하려면 다음을 수행합니다.보기 대 복사본 반환
언급URL : https://stackoverflow.com/questions/27759084/how-to-replace-negative-numbers-in-pandas-data-frame-by-zero
'programing' 카테고리의 다른 글
웹 앱을 Spring Boot 2.4로 업그레이드한 후 잘못된 StateException (0) | 2023.07.22 |
---|---|
이 코드의 의미는 무엇입니까?void(*int sig, void(*func)(int))(int); (0) | 2023.07.22 |
ORA-00997에 대한 해결 방법: LONG 데이터 유형의 잘못된 사용 (0) | 2023.07.22 |
컴파일러에 의한 구조 재정렬 (0) | 2023.07.22 |
Git에서 준비되지 않은 변경 내용의 일부 실행 취소 (0) | 2023.07.17 |