Создайте макеты из столбца с несколькими значениями в pandas
Я ищу питоновский способ справиться со следующей проблемой.
Метод pandas.get_dummies()
отлично подходит для создания манекенов из категориального столбца кадра данных. Например, если столбец имеет значения в ['A', 'B']
, get_dummies()
создает 2 фиктивные переменные и соответственно назначает 0 или 1.
Теперь мне нужно справиться с этой ситуацией. Один столбец, позвольте назвать его "меткой", имеет значения, такие как ['A', 'B', 'C', 'D', 'A*C', 'C*D']
. get_dummies()
создает 6 манекенов, но я хочу только 4 из них, так что строка может иметь несколько 1s.
Есть ли способ справиться с этим по-питоновски? Я мог только подумать о пошаговом алгоритме, чтобы получить его, но это не будет включать get_dummies().
Благодаря
Отредактировано, надеюсь, что это более ясно!
Ответы
Ответ 1
Я знаю, что прошло некоторое время, так как этот вопрос был задан, но есть (по крайней мере, сейчас есть) однострочный, поддерживаемый документацией:
In [4]: df
Out[4]:
label
0 (a, c, e)
1 (a, d)
2 (b,)
3 (d, e)
In [5]: df['label'].str.join(sep='*').str.get_dummies(sep='*')
Out[5]:
a b c d e
0 1 0 1 0 1
1 1 0 0 1 0
2 0 1 0 0 0
3 0 0 0 1 1
Ответ 2
Вы можете сгенерировать фиктивный файл данных с вашими необработанными данными, изолировать столбцы, содержащие данный атом, а затем сохранить результат, совпадающий с столбцом атома.
df
Out[28]:
label
0 A
1 B
2 C
3 D
4 A*C
5 C*D
dummies = pd.get_dummies(df['label'])
atom_col = [c for c in dummies.columns if '*' not in c]
for col in atom_col:
...: df[col] = dummies[[c for c in dummies.columns if col in c]].sum(axis=1)
...:
df
Out[32]:
label A B C D
0 A 1 0 0 0
1 B 0 1 0 0
2 C 0 0 1 0
3 D 0 0 0 1
4 A*C 1 0 1 0
5 C*D 0 0 1 1
Ответ 3
У меня есть несколько более чистое решение. Предположим, мы хотим преобразовать следующий фрейм данных
pageid category
0 0 a
1 0 b
2 1 a
3 1 c
в
a b c
pageid
0 1 1 0
1 1 0 1
Один из способов сделать это - использовать scikit-learn DictVectorizer. Однако мне было бы интересно узнать о других методах.
df = pd.DataFrame(dict(pageid=[0, 0, 1, 1], category=['a', 'b', 'a', 'c']))
grouped = df.groupby('pageid').category.apply(lambda lst: tuple((k, 1) for k in lst))
category_dicts = [dict(tuples) for tuples in grouped]
v = sklearn.feature_extraction.DictVectorizer(sparse=False)
X = v.fit_transform(category_dicts)
pd.DataFrame(X, columns=v.get_feature_names(), index=grouped.index)