Может ли MultiLabelBinarizer представлять количество значений? - PullRequest
0 голосов
/ 09 мая 2018

Допустим, у нас есть списки в столбце данных

df['a'][0] = ['earth','mars','earth','moon']
df['a'][1] = ['jupiter','pluto','sun']

есть ли способ использовать мультилабеларизатор для получения

             earth   mars   moon sun  jupiter  pluto
df['a'][0]     2      1       1   0    0       0    
df['a'][1]     0      0       0   1    1       1   

Я хочу перевести это в огромный список кодов процедур

1 Ответ

0 голосов
/ 19 ноября 2018
import pandas as pd
from sklearn.preprocessing import MultiLabelBinarizer

planet = pd.DataFrame()
planet['planet_group'] = ['group_a', 'group_b']
planet['planet_list'] = [
    ['earth', 'mars', 'earth', 'moon'], ['jupiter', 'pluto', 'sun']]

g_planet = []
l_planet = []

for row in planet.itertuples():
    for i in row.planet_list:
        l_planet.append(i.rstrip())
        g_planet.append(row.planet_group)

data_tuples = list(zip(g_planet, l_planet))
new_planet = pd.DataFrame(data_tuples, columns=['group_name', 'value'])

new_planet['value'] = new_planet['value'].apply(lambda x: [x])
mlb = MultiLabelBinarizer()
finaldf = new_planet.join(pd.DataFrame(mlb.fit_transform(new_planet.pop('value')),
                                       columns=mlb.classes_,
                                       index=new_planet.index))
sumdf = finaldf.groupby('group_name').agg(lambda x: sum(x))

print(sumdf)

вывод будет таким

            earth  jupiter  mars  moon  pluto  sun
group_name                                        
group_a         2        0     1     1      0    0
group_b         0        1     0     0      1    1

я изменил ваш набор данных, добавил имя для каждого списка, затем преобразовал его в новый фрейм данных, содержащий имя и значение, где имя содержит одну планету из связанного списка. затем после применения к MultiLableBinarier мы группируем пользователя и суммируем значение внутри.

Надеюсь, это поможет вам.

...