Панды: разбить столбец массива на ряд двоичных столбцов? - PullRequest
0 голосов
/ 02 ноября 2018

Данные даны так:

df = pd.DataFrame([
    { 'vals': ['foo', 'bar'], 'id': 100 },
    { 'vals': ['foo', 'bar', 'baz'], 'id': 101 },
    { 'vals': ['bar'], 'id': 102 },
    { 'vals': ['foo'], 'id': 103 }  
])

Есть ли какой-нибудь способ, которым я могу превратить его в структуру данных, структурированную так:

id    foo    bar    baz
100   true   true   false
101   true   true   true
102   false  true   false
103   true   false  false

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018
df = df.set_index(['id']).vals.apply(pd.Series).stack().reset_index(level=-1, drop=True).reset_index()
df = df.merge(pd.get_dummies(df[0]), right_index=True, left_index=True).drop(0, axis=1)
df = df.groupby('id').sum()
0 голосов
/ 02 ноября 2018

Использование get_dummies

df.set_index('id').vals.map(','.join).str.get_dummies(',').astype(bool)
Out[8]: 
       bar    baz    foo
id                      
100   True  False   True
101   True   True   True
102   True  False  False
103  False  False   True
0 голосов
/ 02 ноября 2018

Используйте MultiLabelBinarizer с приведением к логическому значению и join все столбцы без vals, извлеченные с помощью pop:

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df =df.join(pd.DataFrame(mlb.fit_transform(df.pop('vals')),columns=mlb.classes_).astype(bool))
print (df)

    id    bar    baz    foo
0  100   True  False   True
1  101   True   True   True
2  102   True  False  False
3  103  False  False   True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...