У меня есть набор данных:

id 1 2 3 
1  1 0 1
2  1 1 1
3  0 1 1

Какой самый быстрый способ установить нули для тех столбцов, в которых первая строка содержит таковые, чтобы выходные данные выглядели так:

id 1 2 3 
1  0 0 0
2  0 1 0
3  0 1 0
1
Tony Z. 24 Июн 2019 в 21:05

3 ответа

Лучший ответ

Вы можете использовать арифметику здесь.


df.iloc[0].ne(1) * df
   1  2  3
0  0  0  0
1  0  1  0
2  0  1  0

< Сильный > < EM> Описание

>>> df.iloc[0].ne(1)
1    False
2     True
3    False
Name: 0, dtype: bool

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

3
user3483203 24 Июн 2019 в 18:15

Ты можешь попробовать:

df.loc[:, df.columns[df.iloc[0].to_numpy(bool)]] = 0
df

Выход:

    1  2  3
id         
1   0  0  0
2   0  1  0
3   0  1  0

Используйте iloc для выбора первой строки, а затем преобразуйте эти значения в массив numpy, используя to_numpy с логическим типом dtype.

Затем используйте логическое индексирование заголовков столбцов данных, чтобы определить, в каких столбцах все значения должны быть обнулены с помощью loc.

4
Scott Boston 24 Июн 2019 в 18:31

Используя reindex

df.loc[:,df.iloc[0]!=1].reindex(columns=df.columns,fill_value=0)
Out[814]: 
    1  2  3
id         
1   0  0  0
2   0  1  0
3   0  1  0
2
YO and BEN_W 24 Июн 2019 в 19:38