通过使用唯一的行值python pandas创建列来转换数据框

时间:2018-10-10 03:15:49

标签: 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

我应该怎么做?

2 个答案:

答案 0 :(得分:2)

使用pd.get_dummies

首先,使用get_dummies

tmp = df.set_index('Name').Activities.str.get_dummies(sep=',')

现在使用stackagg

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.splitmelt

(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聚合后,主要操作完成。