Подтвердить что ты не робот

Удалить столбец в Pandas, если это все нули

В настоящее время у меня есть dataframe, состоящий из столбцов с 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)]

В какие годы представлен список кадров данных за различные годы, которые я анализирую, они состоят из столбцов с одним из них, а нули - это список столбцов, содержащих все нули. Есть ли лучший способ удалить столбец на основе условия? По какой-то причине я должен проверить, находятся ли эти столбцы в списке нулей и удалить их из списка нулей, чтобы получить список всех нулевых столбцов.

4b9b3361

Ответ 1

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, который является True, где 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 - то есть вдоль строк - в одно логическое значение. Следовательно, результат представляет собой одно логическое значение для каждого столбца.)

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)]