Python Pandas: Как создать двоичную матрицу из столбца списков?
У меня есть DataFrame Python Pandas, как показано ниже:
1
0 a, b
1 c
2 d
3 e
a, b
строка, представляющая список пользовательских функций
Как я могу преобразовать это в двоичную матрицу пользовательских функций, таких как следующие:
a b c d e
0 1 1 0 0 0
1 0 0 1 0 0
2 0 0 0 1 0
3 0 0 0 0 1
Я видел аналогичный вопрос Создание логической матрицы из одного столбца с пандами, но в столбце нет записей, которые являются списками.
Я попробовал эти подходы, есть ли способ объединить два:
pd.get_dummies()
pd.get_dummies(df[1])
a, b c d e
0 1 0 0 0
1 0 1 0 0
2 0 0 1 0
3 0 0 0 1
df[1].apply(lambda x: pd.Series(x.split()))
1
0 a, b
1 c
2 d
3 e
Также интересны разные способы создания этого типа двоичной матрицы!
Любая помощь приветствуется!
Спасибо
2 ответа
Решение
Я думаю, что вы можете использовать:
df = df.iloc[:,0].str.split(', ', expand=True)
.stack()
.reset_index(drop=True)
.str.get_dummies()
print df
a b c d e
0 1 0 0 0 0
1 0 1 0 0 0
2 0 0 1 0 0
3 0 0 0 1 0
4 0 0 0 0 1
Редакция:
print df.iloc[:,0].str.replace(' ','').str.get_dummies(sep=',')
a b c d e
0 1 1 0 0 0
1 0 0 1 0 0
2 0 0 0 1 0
3 0 0 0 0 1
Я написал общую функцию с поддержкой группировки, чтобы сделать это некоторое время назад:
def sublist_uniques(data,sublist):
categories = set()
for d,t in data.iterrows():
try:
for j in t[sublist]:
categories.add(j)
except:
pass
return list(categories)
def sublists_to_dummies(f,sublist,index_key = None):
categories = sublist_uniques(f,sublist)
frame = pd.DataFrame(columns=categories)
for d,i in f.iterrows():
if type(i[sublist]) == list or np.array:
try:
if index_key != None:
key = i[index_key]
f =np.zeros(len(categories))
for j in i[sublist]:
f[categories.index(j)] = 1
if key in frame.index:
for j in i[sublist]:
frame.loc[key][j]+=1
else:
frame.loc[key]=f
else:
f =np.zeros(len(categories))
for j in i[sublist]:
f[categories.index(j)] = 1
frame.loc[d]=f
except:
pass
return frame
In [15]: a Out[15]: a group labels 0 1 new [a, d] 1 2 old [a, g, h] 2 3 new [i, m, a] In [16]: sublists_to_dummies(a,'labels') Out[16]: a d g i h m 0 1 1 0 0 0 0 1 1 0 1 0 1 0 2 1 0 0 1 0 1 In [17]: sublists_to_dummies(a,'labels','group') Out[17]: a d g i h m new 2 1 0 1 0 1 old 1 0 1 0 1 0