1. ホーム
  2. python

[解決済み] Pandasでゼロだけを含むカラムを削除するには?

2022-11-06 03:17:10

質問

現在、値として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)]

in which yearsは私が分析している様々な年のdataframeのリストで、onesはその中に1がある列からなり、zerosはすべての0を含む列のリストです。条件に基づいて列を削除する良い方法はないでしょうか?何らかの理由で、私はones列がzerosリストにもあるかどうかをチェックし、すべてのゼロ列のリストを得るためにzerosリストからそれらを削除する必要があります。

どのように解決するのですか?

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 が真であるブール値のDataFrameを作成します。 df がゼロでない場合に真となる。

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) は、どの列が非ゼロ項目を持っているかを示すブーリアン系列を返します。(この any 演算は0軸に沿った値、つまり行に沿った値を1つの真偽値に集約する。したがって、結果は各列に対して1つの真偽値となります)。

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]


ゼロカラムを削除するには、次のように再割り当てします。 df :

df = df.loc[:, (df != 0).any(axis=0)]