판다에서 0만 포함된 열을 삭제하려면 어떻게 해야 합니까?
현재 1과 0을 값으로 하는 열로 구성된 데이터 프레임을 가지고 있습니다. 열을 반복하여 0으로 구성된 열은 삭제하고 싶습니다.제가 지금까지 시도한 것은 다음과 같습니다.
ones = []
zeros = []
for year in years:
for i in range(0,599):
if year[str(i)].values.any() == 1:
ones.append(i)
if year[str(i)].values.all() == 0:
zeros.append(i)
for j in ones:
if j in zeros:
zeros.remove(j)
for q in zeros:
del year[str(q)]
연도는 제가 분석 중인 여러 해 동안의 데이터 프레임 목록입니다. 데이터 프레임은 1개의 열로 구성되며 0은 모든 0을 포함하는 열 목록입니다.조건에 따라 열을 삭제하는 더 좋은 방법이 있습니까?어떤 이유로 저는 모든 0 열 목록을 얻으려면 0 목록에도 one 열이 있는지 확인하고 0 목록에서 제거해야 합니다.
df.loc[:, (df != 0).any(axis=0)]
작동 방식은 다음과 같습니다.
In [74]: import pandas as pd
In [75]: df = pd.DataFrame([[1,0,0,0], [0,0,1,0]])
In [76]: df
Out[76]:
0 1 2 3
0 1 0 0 0
1 0 0 1 0
[2 rows x 4 columns]
df != 0
는 부울 데이터 프레임을 생성합니다. 이 값은 참입니다.df
0이 아님:
In [77]: df != 0
Out[77]:
0 1 2 3
0 True False False False
1 False False True False
[2 rows x 4 columns]
(df != 0).any(axis=0)
0이 아닌 항목이 있는 열을 나타내는 부울 열을 반환합니다.(그any
operation은 0축을 따라(즉, 행을 따라) 단일 부울 값으로 값을 집계합니다.따라서 결과는 각 열에 대해 하나의 부울 값이 됩니다.)
In [78]: (df != 0).any(axis=0)
Out[78]:
0 True
1 False
2 True
3 False
dtype: bool
그리고.df.loc
다음 열을 선택하는 데 사용할 수 있습니다.
In [79]: df.loc[:, (df != 0).any(axis=0)]
Out[79]:
0 2
0 1 0
1 0 1
[2 rows x 2 columns]
0-열을 "삭제"하려면, 다시 할당df
:
df = df.loc[:, (df != 0).any(axis=0)]
사용할 수 있는 다른 방법은 다음과 같습니다.
df.replace(0,np.nan).dropna(axis=1,how="all")
unutbu의 솔루션과 비교했을 때, 이 방법은 분명히 느립니다.
%timeit df.loc[:, (df != 0).any(axis=0)]
652 µs ± 5.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit df.replace(0,np.nan).dropna(axis=1,how="all")
1.75 ms ± 9.49 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
열이 0인 이름을 인쇄/로그에 기록하고 이름별로 배치할 수 있도록 보다 표현적인 방법을 원하는 경우:
zero_cols = [ col for col, is_zero in ((df == 0).sum() == df.shape[0]).items() if is_zero ]
df.drop(zero_cols, axis=1, inplace=True)
일부 고장:
# a pandas Series with {col: is_zero} items
# is_zero is True when the number of zero items in that column == num_all_rows
(df == 0).sum() == df.shape[0])
# a list comprehension of zero_col_names is built from the_series
[ col for col, is_zero in the_series.items() if is_zero ]
열에 일부 NaN 값이 있는 경우 0과 NaN이 모두 있는 열을 제거하려면 다음 방법을 사용할 수 있습니다.
df.loc[:, (df**2).sum() != 0]
이 작업을 수행해야 합니다.
zero_cols = df.columns[(df == 0).all()]
df.drop(labels=zero_cols, axis=1, inplace=True)
언급URL : https://stackoverflow.com/questions/21164910/how-do-i-delete-a-column-that-contains-only-zeros-in-pandas
'source' 카테고리의 다른 글
도커 합성을 수행한 후 컨테이너가 시작되지 않음 -d (0) | 2023.07.26 |
---|---|
텍스트 영역에서 "shift+enter"를 감지하고 새 줄을 생성하려면 어떻게 해야 합니까? (0) | 2023.07.26 |
Mysql: 두 날짜 사이의 모든 데이터 선택 (0) | 2023.07.26 |
Windows에서 GTK+ 3.0을 어떻게 설치합니까? (0) | 2023.07.26 |
Ajax.ActionLink가 작동하지 않습니다. 응답.IsAjaxRequest()는 항상 false입니다. (0) | 2023.07.26 |