【问题标题】:What does the group_keys argument to pandas.groupby actually do?pandas.groupby 的 group_keys 参数实际上是做什么的?
【发布时间】:2016-08-10 04:30:41
【问题描述】:

pandas.DataFrame.groupby 中,有一个参数group_keys,我认为它应该与组键如何包含在数据帧子集中有关。根据文档:

group_keys布尔值,默认为真

调用apply时,将组键添加到索引以识别片段

但是,我真的找不到任何 group_keys 产生实际影响的例子:

import pandas as pd

df = pd.DataFrame([[0, 1, 3],
                   [3, 1, 1],
                   [3, 0, 0],
                   [2, 3, 3],
                   [2, 1, 0]], columns=list('xyz'))

gby = df.groupby('x')
gby_k = df.groupby('x', group_keys=False)

这对apply的输出没有影响:

ap = gby.apply(pd.DataFrame.sum)
#    x  y  z
# x         
# 0  0  1  3
# 2  4  4  3
# 3  6  1  1

ap_k = gby_k.apply(pd.DataFrame.sum)
#    x  y  z
# x         
# 0  0  1  3
# 2  4  4  3
# 3  6  1  1

即使您随时打印出分组的子集,结果仍然是相同的:

def printer_func(x):
    print(x)
    return x

print('gby')
print('--------------')
gby.apply(printer_func)
print('--------------')

print('gby_k')
print('--------------')
gby_k.apply(printer_func)
print('--------------')

# gby
# --------------
#    x  y  z
# 0  0  1  3
#    x  y  z
# 0  0  1  3
#    x  y  z
# 3  2  3  3
# 4  2  1  0
#    x  y  z
# 1  3  1  1
# 2  3  0  0
# --------------
# gby_k
# --------------
#    x  y  z
# 0  0  1  3
#    x  y  z
# 0  0  1  3
#    x  y  z
# 3  2  3  3
# 4  2  1  0
#    x  y  z
# 1  3  1  1
# 2  3  0  0
# --------------

我考虑过默认参数实际上是True 的可能性,但是将group_keys 显式切换为False 也没有什么不同。这个论点究竟是为了什么?

(在pandas 版本0.18.1 上运行)

编辑: 基于this answer,我确实找到了group_keys 改变行为的方法:

import pandas as pd
import numpy as np

row_idx = pd.MultiIndex.from_product(((0, 1), (2, 3, 4)))
d = pd.DataFrame([[4, 3], [1, 3], [1, 1], [2, 4], [0, 1], [4, 2]], index=row_idx)

df_n = d.groupby(level=0).apply(lambda x: x.nlargest(2, [0]))
#        0  1
# 0 0 2  4  3
#     3  1  3
# 1 1 4  4  2
#     2  2  4

df_k = d.groupby(level=0, group_keys=False).apply(lambda x: x.nlargest(2, [0]))

#      0  1
# 0 2  4  3
#   3  1  3
# 1 4  4  2
#   2  2  4

但是,我仍然不清楚group_keys 背后的可理解原理应该做什么。根据 @piRSquared 的回答,这种行为似乎并不直观。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    groupby 中的group_keys 参数在apply 操作期间派上用场,该操作创建一个与分组列[group_keys=True] 对应的附加索引列,并在案例[group_keys=False] 中消除,尤其是在尝试的案例中对各个列执行操作。

    一个这样的例子:

    In [21]: gby = df.groupby('x',group_keys=True).apply(lambda row: row['x'])
    
    In [22]: gby
    Out[22]: 
    x   
    0  0    0
    2  3    2
       4    2
    3  1    3
       2    3
    Name: x, dtype: int64
    
    In [23]: gby_k = df.groupby('x', group_keys=False).apply(lambda row: row['x'])
    
    In [24]: gby_k
    Out[24]: 
    0    0
    3    2
    4    2
    1    3
    2    3
    Name: x, dtype: int64
    

    它的一个预期应用可能是通过将层次结构的一个级别转换为Multi-index 数据框对象来对其进行分组。

    In [27]: gby.groupby(level='x').sum()
    Out[27]: 
    x
    0    0
    2    4
    3    6
    Name: x, dtype: int64
    

    【讨论】:

    • 嗯.. 我仍然觉得我不知道 group_key 在这里的意图。比如......为什么它有这种特定的行为,只有当你有分组列?似乎它只在apply 函数返回Series 时创建多索引,但我不明白为什么。
    【解决方案2】:

    如果您传递一个保留索引的函数,pandas 会尝试保留该信息。但是,如果您传递一个删除所有类似索引信息的函数,group_keys=True 允许您保留该信息。

    改用这个

    f = lambda df: df.reset_index(drop=True)
    

    然后是不同的groupby

    gby.apply(lambda df: df.reset_index(drop=True))
    

    gby_k.apply(lambda df: df.reset_index(drop=True))
    

    【讨论】:

    • 谢谢!这是group_keys 所做的全部吗?我已经用另一个例子编辑了这个问题,group_keys 在哪里做某事,但它似乎与您在此处阐明的group_keys 的含义不一致。
    猜你喜欢
    • 2011-03-11
    • 2010-11-26
    • 2015-06-23
    • 2017-12-26
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多