Pandas groupby和aggregate:为某些单元格生成唯一的单个值



全部,

我有以下pd.DataFrame((:

df = pd.DataFrame({'fruit': ['carrot','carrot','apple','apple', 'tomato'],
'taste': ['sweet','sweet','sweet','bitter','bitter'],
'quality': ['good','poor','rotten','good','good']})

看起来像这样:

fruit   taste quality
0  carrot   sweet    good
1  carrot   sweet    poor
2   apple   sweet  rotten
3   apple  bitter    good
4  tomato  bitter    good

我这样应用Growby和agg:

df.groupby('fruit').agg(pd.Series.tolist)

生产:

taste         quality
fruit                                  
apple   [sweet, bitter]  [rotten, good]
carrot   [sweet, sweet]    [good, poor]
tomato         [bitter]          [good]

但我想要的是:

taste         quality
fruit                                  
apple   [sweet, bitter]  [rotten, good]
carrot            sweet    [good, poor]
tomato           bitter            good

换句话说:我只想聚合具有多个不同值的条目,但当列表只包含相同的唯一项时,我希望它只包含所述项。有没有一种很好的方法可以做到这一点(最好不要遍历df的所有单元格,我的单元格相当大,但也许这是唯一的方法?(?如果我不清楚,我很抱歉,我很难用语言表达出来(因此也有一个困难的标题(。

提前谢谢。

使用自定义lambda函数通过sets删除重复项,并将唯一值转换为标量:

f = lambda x: list(set(x)) if len(set(x)) > 1 else x.iat[0]
df = df.groupby('fruit').agg(f)
print (df)
taste         quality
fruit                                  
apple   [sweet, bitter]  [rotten, good]
carrot            sweet    [poor, good]
tomato           bitter            good

如果订购很重要:

f = lambda x: list(dict.fromkeys(x)) if len(set(x)) > 1 else x.iat[0]
df = df.groupby('fruit').agg(f)
print (df)
taste         quality
fruit                                  
apple   [sweet, bitter]  [rotten, good]
carrot            sweet    [good, poor]
tomato           bitter            good

最新更新