반응형
Pandas에서 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은 1이있는 열로 구성되고 0은 모두 0을 포함하는 열의 목록입니다. 조건에 따라 열을 삭제하는 더 좋은 방법이 있습니까? 어떤 이유로 1 열이 0 목록에 있는지 확인하고 0 목록에서 제거하여 모든 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이 아닌 True 인 부울 DataFrame을 만듭니다 .
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이 아닌 항목이있는 열을 나타내는 부울 Series를 반환합니다. (이 any
작업은 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)
열이없는 이름을 가져 오는 보다 표현적인 방법 을 원하는 경우 이름을 인쇄 / 기록하고 제자리에 놓을 수 있습니다 .
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 ]
반응형
'Programing' 카테고리의 다른 글
Ruby에서 각각과 collect 메소드의 차이점 (0) | 2020.11.30 |
---|---|
GURU_MEDITATION 오류 상태에서 Virtualbox 머신을 어떻게 삭제합니까? (0) | 2020.11.30 |
서비스 워커 JavaScript 업데이트 빈도 (24 시간마다?) (0) | 2020.11.30 |
디버그 모드에서 콘솔 응용 프로그램을 실행 한 후 Visual Studio를 일시 중지하려면 어떻게해야합니까? (0) | 2020.11.29 |
동일한 데이터베이스 내에서 컬렉션을 복사하는 가장 빠른 방법은 무엇입니까? (0) | 2020.11.29 |