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

mwg9r5ms  于 2022-11-20  发布在  其他
关注(0)|答案(3)|浏览(379)

pandas.DataFrame.groupby中,有一个参数group_keys,我认为它应该做一些与如何将组密钥包括在 Dataframe 子集中有关的事情。

组密钥:* 布尔值,默认值为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也没有什么区别。
(Run在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 * 应该做什么 * 背后的可理解的原理。

sycxhyv7

sycxhyv71#

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 Dataframe 对象来按层次结构的一个级别进行分组。

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

puruo6ea2#

如果你传递一个保留索引的函数,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))

q5lcpyga

q5lcpyga3#

答案很简单(只适用于groupby,然后是apply)

Condition 1******当结果集长度与原始df相同时

1.a)如果结果集是按组排序的,group_keys=True将添加组关键字Ex:df.groupby(...).apply(lambda df:df[0] +df[1])***#结果按其特定的组排序***1。b)如果结果集按原始索引排序,则库不需要指定组键,因为原始顺序仍保留。例如:df.groupby(..).apply(lambda df:df +1)***#结果按原始顺序排列***

条件2

1.当结果集长度与原始长度不同时,将始终包括组键例如. df.groupby(...).apply(lambda x:x.mean())***#结果长度将更改/减少。group_keys无效***

相关问题