Используйте MultiLabelBinarizer , если важна производительность:
:
df = pd.DataFrame({'list1':[ ['a','b','c','d'], ['b','c','d', 'e']]})
print (df)
list1
0 [a, b, c, d]
1 [b, c, d, e]
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
df1 = pd.DataFrame(mlb.fit_transform(df['list1']),columns=mlb.classes_)
Или get_dummies
с DataFrame
конструктором:
df1 = (pd.get_dummies(pd.DataFrame(df['list1'].values.tolist()), prefix_sep='', prefix='')
.max(level=0, axis=1))
Другое решение, но медленное, если используются большие данные Series.str.join
с Series.str.get_dummies
:
df1 = df['list1'].str.join('|').str.get_dummies()
print (df1)
a b c d e
0 1 1 1 1 0
1 0 1 1 1 1
РЕДАКТИРОВАТЬ: Если нужны исходные столбцы с удаленным list1
столбцом, используйте DataFrame.pop
для извлечения столбца с DataFrame.join
:
df = pd.DataFrame({'list1':[ ['a','b','c','d'], ['b','c','d', 'e']],
'col1':[1,2],
'col2':list('XY')})
print (df)
list1 col1 col2
0 [a, b, c, d] 1 X
1 [b, c, d, e] 2 Y
from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
df1 = pd.DataFrame(mlb.fit_transform(df.pop('list1')),columns=mlb.classes_, index=df.index)
print (df1)
a b c d e
0 1 1 1 1 0
1 0 1 1 1 1
df1 = (pd.get_dummies(pd.DataFrame(df.pop('list1').values.tolist()), prefix_sep='', prefix='')
.max(level=0, axis=1))
df1 = df.pop('list1').str.join('|').str.get_dummies()
df = df.join(df1)
print (df)
col1 col2 a b c d e
0 1 X 1 1 1 1 0
1 2 Y 0 1 1 1 1