Подтвердить что ты не робот

Создайте макеты из столбца с несколькими значениями в 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(). Благодаря

Отредактировано, надеюсь, что это более ясно!

4b9b3361

Ответ 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)