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小时内删除。