source

판다에서 0만 포함된 열을 삭제하려면 어떻게 해야 합니까?

ittop 2023. 7. 26. 22:26
반응형

판다에서 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는 부울 데이터 프레임을 생성합니다. 이 값은 참입니다.df0이 아님:

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이 아닌 항목이 있는 열을 나타내는 부울 열을 반환합니다.(그anyoperation은 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

반응형