Python:对于多维groupby()透视数据,筛选保留分组的前N个最⼤最⼩数
据?
stackoverflow。
⽂章⽬录
问题:需要把dataframe,先进⾏gourpby()处理、再对结果进⾏排序:
"""现有数据如下:"""
# print(df)
count job source
02 sales A
14 sales B
26 sales C
33 sales D
47 sales E
55 market A
63 market Bgroupby分组
72 market C
84 market D
91 market E
df_gb = df.groupby(['job','source']).agg({'count':sum})
#print(df_groupby)
count # note: 此处有“count”
job source
market A 5
B 3
C 2
D 4
E 1
sales A 2
B 4
C 6
D 3
E 7
我想要:的结果是groupby()⾥边count降序排列、取每个group的前3数据:
job source #(本列count)
market A 5
D 4
B 3
sales E 7
C 6
B 4
⽅法⼀:直接使⽤nlargest()
g = df_gb ['count'].groupby(level=0, group_keys=False)# 更多信息见下边备注
res = g.nlargest(3)
print(res)
# res输出结果如下:
job source #(本列count)
market A 5
D 4
B 3
sales E 7
C 6
B 4
dtype: int64
g = df_gb ['count'].groupby(level=0, group_keys=False)
为什么使⽤df_gb['count'].groupby(level=0),⽽不是upby(by=['count'], level=0)?
为什么.groupby()⾥边需要level=0?
因为"by"和"level"在groupby函数⾄少得有⼀个。
不设置group_keys=False会怎样?
会有2个"job"列。
res = g.nlargest(3)等价于
– res = g.apply(lambda x: x.order(ascending=False).head(3)
⽅法⼆:sort_values()搭配head()
haha = df.sort_values(['job','count'], ascending=False).groupby('job').head(3)
print(haha)
# haha输出结果如下:
count job source # 这⼀次显⽰“列名称” & 也没有增减“列” & 也没有改变“列”的顺序
47 sales E
26 sales C
14 sales B
55 market A
84 market D
63 market B
备注:
nlargest()在下列情况不能使⽤,因为没有count字段:
print(df_groupby)
# 这⾥没有count,导致g = df_groupby['count']不存在。
job source
market A 5
B 3
C 2
D 4
E 1
sales A 2
B 4
C 6
D 3
E 7
groupby()和pd.pivot_table()的结果会删除有NaN的⾏的结果,这和merge()、concat()、join()等函数不同,:
df = pd.DataFrame({'col1':[np.nan,'match', np.nan],'col2':[1,2,1]})
upby('col1').sum())
# 结果如下:
col2
col1
match 2
# ⽽不是
col2
col1
match 2
NaN 2
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论