何时以及为什么DataFrame 分组的排序标志在pd.GroupBy.apply()中被忽略?最好用一个例子来理解这个问题。在以下4种虚拟问题的等价解决方案中,方法1和4遵守排序标志,而方法2和3出于某种原因忽略它。
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进行排序。灵感来源:参见评论中的链接。
# Approach 2:
df.sort_values("i").groupby("i").apply(lambda df: df[["ii"]]+1)
# Approach 3:
df.sort_values("i").groupby("i").apply(fun)发布于 2022-01-25 04:07:29
我不确定该把这作为回复还是评论,因为这只是猜测,但我认为如果你忽略了在群后操作中排序的那一栏,那么熊猫就不再“理解”按该专栏进行排序了。
在示例2中,ret2 = g.apply(lambda df: df[["ii"]]+1)意味着在lambda函数中,您将删除"i“列,这样熊猫就不再需要对该列进行排序。
在示例4中,您将包括列'i'在内的整个df连接起来,以便熊猫“知道”按该列进行排序。
https://stackoverflow.com/questions/70842600
复制相似问题