Как создать двоичную таблицу перекрестной проверки из сводной таблицы с помощью Pandas

#python #pandas #numpy #pivot #mask

Вопрос:

У меня есть набор данных, который выглядит следующим образом

перед поворотом

Когда я делаю разворот, то это должно выглядеть так

после поворота

Но чего я действительно хочу, так это

чего я хочу?

Я могу сделать это с помощью петель и материалов своего рода вручную, что не очень красиво и интуитивно понятно… как будто я мог бы искать значения, которые не являются типом «Нет», а затем заменить их на True и ifnot False. Но это, опять же, не очень красиво, и это может занять некоторое время, если я выполню его на большом наборе данных (что будет иметь место).

Поэтому я хотел бы знать, могу ли я сделать это с помощью одной строки или пары строк более красивым и быстрым способом.

Спасибо!

Ответ №1:

От вашего DataFrame :

 import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO("""
ID,ISIN
AXAMIL,A
AXAMIL,B
AXAMIL,C
AXAEXL,D
UNPEVL,A
UNPEVL,E
UNPMSP,A
UNPMSP,B"""), sep=',')
df
 

Мы можем использовать a groupby , затем unstack результат и преобразовать его так boolean , чтобы получить ожидаемый результат :

 >>> df.groupby(['ID', 'ISIN']).size().unstack(fill_value=0).astype(bool).rename_axis(None, axis=1).reset_index()
    ID      A       B       C       D       E
0   AXAEXL  False   False   False   True    False
1   AXAMIL  True    True    True    False   False
2   UNPEVL  True    False   False   False   True
3   UNPMSP  True    True    False   False   False
 

Ответ №2:

Вы можете просто использовать этот isna() метод, вот так:

 new_df = ~df.isna()
 

Ответ №3:

pandas.DataFrame.pivot_table это то, что вы ищете. assign просто создает фиктивную переменную для агрегирования.

 df = (
    df.assign(**{"": 1})
      .pivot_table(
          index="ID", 
          columns="ISIN", 
          aggfunc="max", 
          fill_value=0,
      ).astype(bool)
)
 

Выходы:

 ISIN        A      B      C      D      E
ID
AXAEXL  False  False  False   True  False
AXAMIL   True   True   True  False  False
UNPEVL   True  False  False  False   True
UNPMSP   True   True  False  False  False