pandas.groupby的group_keys参数实际上做了什么?

时间:2016-08-09 17:00:09

标签: python pandas

pandas.DataFrame.groupby中,有一个参数group_keys,我收集它应该做一些与组密钥如何包含在数据框子集中有关的事情。根据文件:

  

group_keys 布尔值,默认为True

     
    

调用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上运行)

修改 我找到了group_keys基于this answer改变行为的方法:

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 的回答,这种行为似乎并不直观。

2 个答案:

答案 0 :(得分:6)

groupby中的

group_keys参数在创建与分组列[group_keys=True]对应的附加索引列的apply操作中很方便,并在[{{{{{ 1}}]特别是在尝试对各个列执行操作时。

一个这样的例子:

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

答案 1 :(得分:2)

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

改为使用

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

然后是不同的groupby

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

enter image description here

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

enter image description here