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。