[英]Pandas GroupBy.apply method duplicates first group
我的第一个 SO 问题:我对 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
我首先检查 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)
然后我尝试在 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
任何帮助,将不胜感激! 谢谢。
编辑:@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
但是通过将方法的返回值分配给一个新对象,我们看到它按预期工作:
>>> df2 = df.groupby('class', group_keys = True).apply(addone)
>>> print(df2)
class count
0 A 2
1 B 1
2 C 3
从 v0.25 开始, GroupBy.apply()
只会评估第一组一次。 见GH24748 。
0.25.0 中的新功能(2019 年 7 月 18 日): Groupby.apply
上的DataFrame
仅评估第一组一次
文档中的相关示例:
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
新行为 (>=v0.25):
df.groupby('a').apply(func)
x
y
a b
0 x 1
1 y 2
旧行为 (<=v0.24.x):
df.groupby('a').apply(func)
x
x
y
a b
0 x 1
1 y 2
Pandas 仍然使用第一组来确定apply
是否可以走快速路径。 但至少它不再需要对第一组进行两次评估。 干得好,开发人员!
您可以使用 for 循环来避免 groupby.apply 重复的第一行,
日志样本.csv
guestid,keyword
1,null
2,null
2,null
3,null
3,null
3,null
4,null
4,null
4,null
4,null
我的代码片段
df=pd.read_csv("log_sample.csv")
grouped = df.groupby("guestid")
for guestid, df_group in grouped:
print(list(df_group['guestid']))
df.head(100)
输出
[1]
[2, 2]
[3, 3, 3]
[4, 4, 4, 4]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.