Преобразование нулей и единиц в bool при сохранении pd.NA в фрейме данных индекса с несколькими столбцами

У меня есть индекс данных с несколькими столбцами. Некоторые заголовки столбцов могут иметь значения pd.NA.

Фактические значения в фрейме данных могут быть равны нулю, единице или pd.NA.

Как преобразовать все нули и единицы в bool, сохранив при этом значения pd.NA?

import pandas as pd

idx_l1 = ("a", "b")
idx_l2 = (pd.NA, pd.NA)
idx_l3 = ("c", "c")

df = pd.DataFrame(
    data=[
        [1, pd.NA, 0, pd.NA, 0, 1, pd.NA, pd.NA],
        [pd.NA, 0, 1, pd.NA, pd.NA, pd.NA, 0, 0],
        [0, 1, 1, 1, 0, pd.NA, pd.NA, 0],
    ],
    columns=pd.MultiIndex.from_product([idx_l1, idx_l2, idx_l3]),
)
df = df.rename_axis(["level1", "level2", "level3"], axis=1)

print(df)

level1     a                    b                  
level2   NaN                  NaN                  
level3     c     c  c     c     c     c     c     c
0          1  <NA>  0  <NA>     0     1  <NA>  <NA>
1       <NA>     0  1  <NA>  <NA>  <NA>     0     0
2          0     1  1     1     0  <NA>  <NA>     0

Если я что-то не упустил — df = df.astype('boolean') не работает?

Asish M. 21.12.2022 16:02

OMG, я работал с df = df.astype(bool), что не работает. Это решение кажется самым питоническим.

Andi 21.12.2022 16:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать метод .replace:

df = df.replace({1: True, 0: False})

print(df)

Выход:

level1      a                          b                    
level2    NaN                        NaN                    
level3      c      c      c     c      c     c      c      c
0        True   <NA>  False  <NA>  False  True   <NA>   <NA>
1        <NA>  False   True  <NA>   <NA>  <NA>  False  False
2       False   True   True  True  False  <NA>   <NA>  False

Вы возвращаете исходный фрейм данных. Тем не менее, я думаю, ваше решение работает нормально.

Andi 21.12.2022 16:01

@Andi хороший звонок, спасибо.

Xiddoc 21.12.2022 16:05

@СкоттС спасибо. Скопировал не те вещи после тестирования в интерактивной консоли

Xiddoc 21.12.2022 16:10

Другие вопросы по теме