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 мы группируем пользователя и суммируем значение внутри.
Надеюсь, это поможет вам.