Использование stack
+ pandas.Series.str.get_dummies
df.assign(
D=df.stack().str.get_dummies(';').sum(level=0).gt(1).any(1).astype(int)
)
A B C D
0 mom;dad;son; sister;son; yes;no;maybe; 1
1 dad; daughter;niece; no;snow; 0
2 son;dad; cat;son;dad; tree;dad;son; 1
3 daughter;mom; niece; referee; 0
4 dad;daughter; cat; dad; 1
Детали
Обратите внимание, что когда мы складываем и получаем манекены, промежуточный результат выглядит следующим образом:
cat dad daughter maybe mom niece no referee sister snow son tree yes
0 A 0 1 0 0 1 0 0 0 0 0 1 0 0
B 0 0 0 0 0 0 0 0 1 0 1 0 0
C 0 0 0 1 0 0 1 0 0 0 0 0 1
1 A 0 1 0 0 0 0 0 0 0 0 0 0 0
B 0 0 1 0 0 1 0 0 0 0 0 0 0
C 0 0 0 0 0 0 1 0 0 1 0 0 0
2 A 0 1 0 0 0 0 0 0 0 0 1 0 0
B 1 1 0 0 0 0 0 0 0 0 1 0 0
C 0 1 0 0 0 0 0 0 0 0 1 1 0
3 A 0 0 1 0 1 0 0 0 0 0 0 0 0
B 0 0 0 0 0 1 0 0 0 0 0 0 0
C 0 0 0 0 0 0 0 1 0 0 0 0 0
4 A 0 1 1 0 0 0 0 0 0 0 0 0 0
B 1 0 0 0 0 0 0 0 0 0 0 0 0
C 0 1 0 0 0 0 0 0 0 0 0 0 0
Где предыдущие столбцы встроены во второй уровень индекса. Поэтому я хочу подвести итог по первому уровню, чтобы увидеть, сколько раз это слово появляется.
Этот промежуточный результат суммирования выглядит так:
cat dad daughter maybe mom niece no referee sister snow son tree yes
0 0 1 0 1 1 0 1 0 1 0 2 0 1
1 0 1 1 0 0 1 1 0 0 1 0 0 0
2 1 3 0 0 0 0 0 0 0 0 3 1 0
3 0 0 1 0 1 1 0 1 0 0 0 0 0
4 1 2 1 0 0 0 0 0 0 0 0 0 0
Обратите внимание, что мы ловим 'son'
в строке 1, 'dad'
и 'son'
в строке 3 и т. Д.
Если он появляется в более чем 1 столбце (отсюда gt(1)
), тогда я хочу считать его как 1
(отсюда any(1).astype(int)
).