首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在某些情况下pandas.GroupBy.apply()忽略排序标志?

问为什么在某些情况下pandas.GroupBy.apply()忽略排序标志?
EN

Stack Overflow用户
提问于 2022-01-25 01:56:26
回答 1查看 94关注 0票数 4

何时以及为什么DataFrame 分组的排序标志在pd.GroupBy.apply()中被忽略?最好用一个例子来理解这个问题。在以下4种虚拟问题的等价解决方案中,方法1和4遵守排序标志,而方法2和3出于某种原因忽略它。

代码语言:javascript
复制
import pandas as pd
import numpy as np 

#################################################
# Construct input data:
cats = list("bcabca")
vals = np.arange(0,10*len(cats),10) 
df = pd.DataFrame({"i": cats, "ii": vals})

# df:
#      i  ii
#   0  b   0
#   1  c  10
#   2  a  20
#   3  b  30
#   4  c  40
#   5  a  50

# Groupby with sort=True
g = df.groupby("i", sort=True)

#################################################
# 1) This correctly returns a sorted series
ret1 = g.apply(lambda df: df["ii"]+1)

# ret1:
#   i
#   a  2    21
#      5    51
#   b  0     1
#      3    31
#   c  1    11
#      4    41

#################################################
# 2) This ignores the sort flag
ret2 = g.apply(lambda df: df[["ii"]]+1)

# ret2:
#      ii
#   0   1
#   1  11
#   2  21
#   3  31
#   4  41
#   5  51

#################################################
# 3) This also ignores the sort flag.
def fun(df):
    df["iii"] = df["ii"] + 1
    return df
ret3 = g.apply(fun)

# ret3
#      i  ii  iii
#   0  b   0    1
#   1  c  10   11
#   2  a  20   21
#   3  b  30   31
#   4  c  40   41
#   5  a  50   51

#################################################
# 4) This, however, respects the sort flag again:
ret4 = {}
for key, dfg in g:
    ret4[key] = fun(dfg)
ret4 = pd.concat(ret4, axis=0)

# ret4:
#        i  ii  iii
#   a 2  a  20   21
#     5  a  50   51
#   b 0  b   0    1
#     3  b  30   31
#   c 1  c  10   11
#     4  c  40   41

这是熊猫的设计缺陷吗?还是这种行为是故意的?从pd.DataFrame.groupby()和pd.GroupBy.apply()的文档中,我希望解决方案2和3也会考虑排序标志。他们为什么不呢?

(问题在大熊猫1.2.4和1.4.0中重现)

更新:方法2和3的解决方法是首先根据分组键对DataFrame进行排序。灵感来源:参见评论中的链接。

代码语言:javascript
复制
# Approach 2:
df.sort_values("i").groupby("i").apply(lambda df: df[["ii"]]+1)
# Approach 3:
df.sort_values("i").groupby("i").apply(fun)
EN

回答 1

Stack Overflow用户

发布于 2022-01-25 04:07:29

我不确定该把这作为回复还是评论,因为这只是猜测,但我认为如果你忽略了在群后操作中排序的那一栏,那么熊猫就不再“理解”按该专栏进行排序了。

在示例2中,ret2 = g.apply(lambda df: df[["ii"]]+1)意味着在lambda函数中,您将删除"i“列,这样熊猫就不再需要对该列进行排序。

在示例4中,您将包括列'i'在内的整个df连接起来,以便熊猫“知道”按该列进行排序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70842600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档