groupby中每行的唯一值

2024-05-12 20:26:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个简单的dataframe(df),如下所示:

index Job  Person 
1     j1   Cathy
2     j2   Mark
3     j3   Cathy
4     j4   Steve
5     j5   Cathy
6          Cathy
7     j1   Cathy

我想将上述dataframe转换为:

Person CountJob  JobDetails
Cathy     4      j1;j3;j5
Mark      1      j2
Steve     1      j4

也就是说,删除空值,为每个人加入唯一的工作

我可以使用groupby部分解决这个问题:

df.groupby('Person').agg(CountJob=('Job','count'),
                         JobDetails=('Job',lambda x: ';'.join(x.dropna()))
                        )

我可以删除空值,但似乎无法获得唯一值;在上面的示例中,对于“Cathy”,“JobDetails”变为j1;j3;j5;j1


Tags: dataframedfjobpersonstevemark空值j5
3条回答

另一种方法是将索引设置为Personstack以删除任何空值,然后我们可以毫无问题地应用任何group by参数

df.set_index('Person').stack().groupby('Person')\
                .agg(JobDetails=('unique'), Job=('count'))

          JobDetails  Job
Person                   
Cathy   [j1, j3, j5]    4
Mark            [j2]    1
Steve           [j4]    1

dropna添加unique

df.groupby('Person').agg(CountJob=('Job','count'),
                         JobDetails=('Job',lambda x: ';'.join(x.dropna().unique()))
                        )
Out[143]: 
        CountJob JobDetails
Person                     
Cathy          4   j1;j3;j5
Mark           1         j2
Steve          1         j4

可以考虑在聚合之前放弃null:

   (
    df.dropna()
    .groupby("Person")
    .agg(CountJob=("Job", "count"), JobDetails=("Job", set))
    .assign(JobDetails=lambda df: df.JobDetails.str.join(","))
)

      CountJob  JobDetails
Person      
Cathy   4   j1,j3,j5
Mark    1   j2
Steve   1   j4

相关问题 更多 >