[英]Why does pandas.GroupBy.apply() ignore the sort flag in some situations?
何時以及為什么在pd.GroupBy.apply()
中忽略 DataFrame 分組的排序標志? 這個問題最好用一個例子來理解。 在以下 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
這是 pandas 中的設計缺陷嗎? 還是這種行為是故意的? 從pd.DataFrame.groupby()
和pd.GroupBy.apply()
的文檔中,我希望解決方案 2 和 3 也將排序標志考慮在內。 他們為什么不呢?
(使用 pandas 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)
我不確定是否將其作為答案或評論發布,因為這是一個猜測,但我認為如果您在 groupby 之后省略您在操作中排序的列,那么 pandas 不再“理解”排序依據那一欄。
In example 2), ret2 = g.apply(lambda df: df[["ii"]]+1)
means that in your lambda function, you are dropping the "i" column from consideration so pandas no longer has this column to排序方式。
在示例 4) 中,您將連接整個 df,包括列'i'
,因此 pandas “知道”按該列排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.