Даны иерархические данные, где каждая запись имеет основную категорию f1, подкатегорию f2, подкатегорию f3 и результат y. Например, мы могли бы посмотреть на данные о человеке, где каждая запись соответствует уникальному человеку, f1 = страна, f2 = провинция, f3 = город, где родился человек, и y = двоичное значение, указывающее, имеет ли человек конкретный c ген. Вот небольшой пример:
f1 f2 f3 y
0 1 A a 0
1 1 A b 1
2 1 B c 1
3 1 B a 1
4 2 A a 0
5 2 A c 0
6 2 B d 0
То, что я хотел бы сделать, это обобщить эти данные на основе результата y, используя подстановочные знаки '*'.
f1 f2 f3 y s
0 1 A a 0 1.A.a
1 1 A b 1 1.A.b
2 1 B c 1 1.B.*
3 1 B a 1 1.B.*
4 2 A a 0 2.*.*
5 2 A c 0 2.*.*
6 2 B d 0 2.*.*
В приведенной выше таблице я создал сводный столбец s. Здесь записи 4, 5 и 6 представлены как '2.*.*'
, поскольку все записи с f1 = 2 имеют y = 0, независимо от подкатегорий f2 и f3. Аналогично, 2 и 3 могут быть представлены как '1.B.*'
, поскольку результат y для f1 = 1, f2 = B всегда равен 1, независимо от значения f3. Крайний крайний случай возникает, если все результаты у одинаковы. В этом случае мы представили бы каждую запись как *.*.*
.
Вопрос в том, как эффективно построить этот итоговый столбец. Я полагаю, что могу каким-то образом добиться этого, используя групповые выражения, но я не совсем уверен, как. Обратите внимание, что этот пример ограничен 3 категориями f1, f2, f3 и y ограничен двоичным, но на практике может быть больше категорий и больше возможных значений результата в y.
Код для создания Таблица выше:
import pandas as pd
df = pd.DataFrame({'f1': [1,1,1,1,2,2,2],
'f2': ['A','A','B','B','A','A','B'],
'f3': ['a','b','c','a','a','c','d'],
'y': [0,1,1,1,0,0,0]})
print(df)