Pandas pd.pivot_table 其中 aggfunc returns 子组中唯一项的集合或列表

Pandas pd.pivot_table where aggfunc returns a set or list of unique items within a subgroup

我正在寻找一种 pivotgroupby 数据框的有效方法,其中输出是该子组中唯一项目的列表。我对使用循环不感兴趣,更愿意将结果保留为数据框。提前谢谢你。

示例 df:

number letter fruit
101 a apple
101 b melon
101 a peach
201 b grape
101 b orange
101 a pear
201 b apple
201 a peach

我的代码:

df=pd.DataFrame({'number':['101','101','101','201','101','101','201','201'], 'letter': ['a','b','a','b','b','a','b','a'], 'fruit':['apple','melon','peach','grape','orange','pear','apple','peach'] })
    
pd.pivot_table(df, index='number', columns='letter', values='fruit', aggfunc='sum')

输出:

letter a b
number
101 appleapplepear melonorange
201 peach grapeapple

期望输出:

letter a b
number
101 [apple ,pear] [melon ,orange]
201 [peach] [grape ,apple]

尝试:

>>> pivoted = pd.pivot_table(df, index='number', columns='letter', values='fruit', aggfunc=lambda x: list(set(x)))
letter                     a                b
number                                       
101     [apple, peach, pear]  [melon, orange]
201                  [peach]   [grape, apple]

也可以用pd.unique代替aggfunc,如下:

pd.pivot_table(df, index='number', columns='letter', values='fruit', aggfunc=pd.unique)

请注意,单个项目的输出不在列表中。有些人喜欢这个,但看看它是否符合您的喜好。

结果:

letter                     a                b
number                                       
101     [apple, peach, pear]  [melon, orange]
201                    peach   [grape, apple]

如果你喜欢将单个项目也放入列表中,你可以稍微修改对pd.unique的调用,如下所示:

pd.pivot_table(df, index='number', columns='letter', values='fruit', aggfunc=lambda x: pd.unique(x).tolist())

结果:

letter                     a                b
number                                       
101     [apple, peach, pear]  [melon, orange]
201                  [peach]   [grape, apple]

因此,您现在可以为单个项目选择 2 种输出布局。