我有一个以下数据框
Name Activities
Eric Soccer,Baseball,Swimming
Natasha Soccer
Mike Basketball,Baseball
我需要将其转换为以下数据框
Activities Name
Soccer Eric,Natasha,Mike
Swimming Eric
Baseball Eric,Mike
Basketball Mike
我应该怎么做?
答案 0 :(得分:2)
pd.get_dummies
首先,使用get_dummies
:
tmp = df.set_index('Name').Activities.str.get_dummies(sep=',')
现在使用stack
和agg
:
tmp.mask(tmp.eq(0)).stack().reset_index('Name').groupby(level=0).agg(', '.join)
Name
Baseball Eric, Mike
Basketball Mike
Soccer Eric, Natasha
Swimming Eric
str.split
和melt
(df.set_index('Name').Activities.str.split(',', expand=True)
.reset_index().melt(id_vars='Name').groupby('value').Name.agg(', '.join))
答案 1 :(得分:1)
您可以通过执行split
然后将结果列表转换为Series
来分隔活动。
然后melt
从宽格式到长格式,然后groupby
得到的value
列(即Activities
)。
在分组的数据框中,join
与每个活动关联的“名称”字段。
赞:
(df.Activities.str.split(",")
.apply(pd.Series)
.merge(df, right_index=True, left_index=True)
.melt(id_vars="Name", value_vars=[0,1,2])
.groupby("value")
.agg({'Name': lambda x: ','.join(x)})
.reset_index()
.rename(columns={"value":"Activities"})
)
输出:
Activities Name
0 Baseball Eric,Mike
1 Basketball Mike
2 Soccer Eric,Natasha
3 Swimming Eric
注意:链末端的reset_index()
和rename()
方法仅仅是修饰性的; groupby
聚合后,主要操作完成。