Python 通过使用唯一的行值生成列来转换dataframe

Python 通过使用唯一的行值生成列来转换dataframe,python,pandas,Python,Pandas,我有一个如下的数据帧 Name Activities Eric Soccer,Baseball,Swimming Natasha Soccer Mike Basketball,Baseball Activities Name Soccer Eric,Natasha,Mike Swimming Eric Baseball Eric,Mike Basketball Mike 我需要将其转换为以下数据

我有一个如下的数据帧

Name      Activities
Eric      Soccer,Baseball,Swimming
Natasha   Soccer
Mike      Basketball,Baseball
Activities     Name
Soccer          Eric,Natasha,Mike
Swimming        Eric
Baseball        Eric,Mike
Basketball      Mike
我需要将其转换为以下数据帧

Name      Activities
Eric      Soccer,Baseball,Swimming
Natasha   Soccer
Mike      Basketball,Baseball
Activities     Name
Soccer          Eric,Natasha,Mike
Swimming        Eric
Baseball        Eric,Mike
Basketball      Mike

我应该怎么做?

您可以通过执行
拆分
然后将结果列表转换为
系列
来分离活动
然后从宽格式到长格式,以及
groupby
生成的
value
列(即
Activities
)。
在分组数据框中,
加入与每个活动关联的名称字段

像这样:

(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\u index()
rename()
方法只是装饰性的;主要操作在
groupby
aggregation之后完成。

使用
pd.get\u 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)


使用
str.split
melt

到目前为止,您尝试了什么?Mike没有将足球作为一项活动,但您在足球输出中列出了Mike。