Превращение таблицы с горячим кодированием в 2D-таблицу подсчетов - PullRequest
1 голос
/ 06 мая 2020

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

У меня есть таблица данных с горячим кодированием, что-то вроде:

Index.  A1.     A2.     A3.     B1.     B2.     C1.     C2.     C3.     C4.     
0.      True.   False.  True.   True.   True.   False.  True.   False.  False.  
...

Таким образом, каждая запись является логической, и моя столбцы состоят из нескольких групп категорий (A, B и C).

Я хочу создать новые DataFrames, в которых я выбираю любые две категории и получаю таблицу с подсчетом количества людей находятся в паре категорий, соответствующих этой строке / столбцу. Итак, если бы я смотрел на категории A и B, я бы сгенерировал таблицу:

Index.  A1.     A2.     A3.   None    Total 
B1.     x11.    x12.    x13.  x1N     x1T
B2.     x21.    x22.    x23.  x2N.    x2T
None.   xN1.    xN2.    xN3.  xNN     xNT
Total.  xT1.    xT2.    xT3.  xTN     xTT

, где x11 - это количество строк в исходной таблице, которые имеют как A1, так и B1 True, x12 - это количество из тех строк, которые имеют A1 и B2 True, и т. д.

Меня также интересует количество тех записей, где все значения A были False и / или все значения B были ложными, которые учитывается в столбцах «Нет».

Наконец, мне также нужны итоги строк, в которых любой из столбцов в соответствующей категории имеет значение «Истина». Таким образом, x1T будет количеством строк, в которых B1 имеет значение True, а любой из A1, A2 или A3 - True и так далее (обратите внимание, что это не просто сумма x11, x12 и x13, поскольку категории не всегда являются взаимоисключающими; например, строка может иметь как A1 True, так и A2 True). xNN - это количество строк, которые имеют все ложные значения для A1, A2, A3, B1, B2, а xTT - это количество строк, которые имеют хотя бы одно истинное значение для любого из A1, A2, A3, B1 и B2, поэтому xNN + xTT будет равно общему количеству строк в исходной таблице.

Спасибо, Грэм

1 Ответ

1 голос
/ 06 мая 2020

Это мой подход:

def get_table(data, prefix):
    '''
    get the columns in the respective category
    and assign `none` and `Total` columns
    '''
    return (df.filter(like=prefix)
              .assign(none=lambda x: (1-x).prod(1),
                      Total=lambda x: x.any(1))
           )

# sample data
np.random.seed(1)
df = pd.DataFrame(np.random.choice([True,False], size=(5,9), p=(0.6,0.4)),
                 columns=[f'{x}{y}'for x in 'ABC' for y in '123'])

# the output
df = df.astype(int)
get_table(df, 'B').T @ get_table(df, 'A')

Вывод:

      A1 A2 A3 none Total
B1     3  2  1    0     3
B2     3  2  1    0     3
B3     2  1  1    0     2
none   0  0  1    0     1
Total  4  3  2    0     5

Здесь я не понимаю, почему (none, Total) должен быть равен нулю. Так как none соответствует всем False в B, а Total соответствует некоторым True в A.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...