Pandas pd.pivot_table 其中 aggfunc returns 子组中唯一项的集合或列表
Pandas pd.pivot_table where aggfunc returns a set or list of unique items within a subgroup
我正在寻找一种 pivot
或 groupby
数据框的有效方法,其中输出是该子组中唯一项目的列表。我对使用循环不感兴趣,更愿意将结果保留为数据框。提前谢谢你。
示例 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 种输出布局。
我正在寻找一种 pivot
或 groupby
数据框的有效方法,其中输出是该子组中唯一项目的列表。我对使用循环不感兴趣,更愿意将结果保留为数据框。提前谢谢你。
示例 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 种输出布局。