簡體   English   中英

為什么 pandas.GroupBy.apply() 在某些情況下會忽略排序標志?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM