NC *_*Jim 37 python group-by pandas pandas-groupby
我的第一个问题:我对pandas(0.12.0-4)中groupby的apply方法的这种行为感到困惑,它似乎将函数TWICE应用于数据帧的第一行.例如:
>>> from pandas import Series, DataFrame
>>> import pandas as pd
>>> df = pd.DataFrame({'class': ['A', 'B', 'C'], 'count':[1,0,2]})
>>> print(df)
class count
0 A 1
1 B 0
2 C 2
Run Code Online (Sandbox Code Playgroud)
我首先检查groupby函数是否正常,看起来没问题:
>>> for group in df.groupby('class', group_keys = True):
>>> print(group)
('A', class count
0 A 1)
('B', class count
1 B 0)
('C', class count
2 C 2)
Run Code Online (Sandbox Code Playgroud)
然后我尝试在groupby对象上使用apply做类似的事情,我得到第一行输出两次:
>>> def checkit(group):
>>> print(group)
>>> df.groupby('class', group_keys = True).apply(checkit)
class count
0 A 1
class count
0 A 1
class count
1 B 0
class count
2 C 2
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激!谢谢.
编辑:@Jeff提供以下答案.我是密集的,并没有立即理解它,所以这里有一个简单的例子来表明,尽管在上面的例子中第一组的双重打印输出,apply方法只在第一组上运行一次,并且不会改变原始数据框:
>>> def addone(group):
>>> group['count'] += 1
>>> return group
>>> df.groupby('class', group_keys = True).apply(addone)
>>> print(df)
class count
0 A 1
1 B 0
2 C 2
Run Code Online (Sandbox Code Playgroud)
但是通过将方法的返回值分配给新对象,我们看到它按预期工作:
df2 = df.groupby('class',group_keys = True).apply(addone)print(df2)
class count
0 A 2
1 B 1
2 C 3
Run Code Online (Sandbox Code Playgroud)
从v0.25开始,GroupBy.apply()只会对第一组进行一次评估。参见GH24748。
文档中的相关示例:
pd.__version__
# '0.25.0.dev0+590.g44d5498d8'
df = pd.DataFrame({"a": ["x", "y"], "b": [1, 2]})
def func(group):
print(group.name)
return group
Run Code Online (Sandbox Code Playgroud)
新行为(> = v0.25):
df.groupby('a').apply(func)
x
y
a b
0 x 1
1 y 2
Run Code Online (Sandbox Code Playgroud)
旧行为(<= v0.24.x):
df.groupby('a').apply(func)
x
x
y
a b
0 x 1
1 y 2
Run Code Online (Sandbox Code Playgroud)
熊猫仍然使用第一组来确定是否apply可以走快速道路。但是至少它不再需要对第一组进行两次评估。做得好,开发人员!
| 归档时间: |
|
| 查看次数: |
8021 次 |
| 最近记录: |