Pandas groupby中每行的唯一值

2 人关注

我有一个简单的 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

i.e, drop the Nulls并加入Unique每个人的工作。

我可以用groupby部分地解决这个问题。

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

我能够删除空值,但似乎无法获得唯一的值;在上面的例子中,对于'凯茜', '工作细节' becomes j1;j3;j5;j1

python
pandas
pandas-groupby
CodeMaster
CodeMaster
发布于 2021-03-04
3 个回答
BENY
BENY
发布于 2021-03-04
已采纳
0 人赞同

Adding unique chain with dropna

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
    
aah.我在join()之后设置了.unique().因此,它一直失败...谢谢!
sammywemmy
sammywemmy
发布于 2021-03-04
0 人赞同

你可以考虑在聚合之前去掉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
Umar.H
Umar.H
发布于 2021-03-04
0 人赞同

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

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