在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)
Run Code Online (Sandbox Code Playgroud)
它对输出没有影响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
Run Code Online (Sandbox Code Playgroud)
即使您按原样打印出分组子集,结果仍然相同:
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
# --------------
Run Code Online (Sandbox Code Playgroud)
我认为默认参数实际上是可能的True
,但切换group_keys
到显式False
也没有区别.这个论点究竟是什么?
(在pandas
版本上运行0.18.1
)
编辑:
我确实找到了一种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
Run Code Online (Sandbox Code Playgroud)
但是,我还没有背后的东西可以理解的原则明确的group_keys
是应该做的.根据@piRSquared的回答,这种行为似乎并不直观.
group_keys
在创建与分组列[ ] 对应的附加索引列的操作groupby
期间apply
,参数in 很方便,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
Run Code Online (Sandbox Code Playgroud)
其中一个预期的应用程序可以是通过将其转换为Multi-index
数据框对象来按层次结构的一个级别进行分组.
In [27]: gby.groupby(level='x').sum()
Out[27]:
x
0 0
2 4
3 6
Name: x, dtype: int64
Run Code Online (Sandbox Code Playgroud)
如果您传递一个保留索引的函数,pandas 会尝试保留该信息。但是,如果您传递一个删除所有索引信息的函数,则group_keys=True
允许您保留该信息。
改用这个
f = lambda df: df.reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)
那么不同的 groupby
gby.apply(lambda df: df.reset_index(drop=True))
Run Code Online (Sandbox Code Playgroud)
gby_k.apply(lambda df: df.reset_index(drop=True))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4842 次 |
最近记录: |