我有以下数据框
X Y
0 A 10
1 A 9
2 A 8
3 A 5
4 B 100
5 B 90
6 B 80
7 B 50
和两个非常相似的不同功能
def func1(x):
if x.iloc[0]['X'] == 'A':
x['D'] = 1
else:
x['D'] = 0
return x[['X', 'D']]
def func2(x):
if x.iloc[0]['X'] == 'A':
x['D'] = 'u'
else:
x['D'] = 'v'
return x[['X', 'D']]
现在我可以分组/应用这些函数
df.groupby('X').apply(func1)
df.groupby('X').apply(func2)
第一行给了我我想要的,即
X D
0 A 1
1 A 1
2 A 1
3 A 1
4 B 0
5 B 0
6 B 0
7 B 0
但第二行返回了一些很奇怪的东西
X D
0 A u
1 A u
2 A u
3 A u
4 A u
5 A u
6 A u
7 A u
所以我的问题是:
- 谁能解释为什么类型更改时 groupby/apply 的行为会有所不同?
- 我怎样才能得到类似的东西
func2
?
问题很简单,应用于 GroupBy 的函数应该never尝试更改它收到的数据帧。它是副本(可以安全地更改,但在原始数据帧中看不到更改)还是视图,取决于实现。该选择是由 pandas 优化器完成的,作为用户,您应该知道它是被禁止的。
正确的方法是强制复制:
def func2(x):
x = x.copy()
if x.iloc[0]['X'] == 'A':
x['D'] = 'u'
else:
x['D'] = 'v'
return x[['X', 'D']]
在那之后,df.groupby('X').apply(func2).reset_index(level=0, drop=True)
按预期给出:
X D
0 A u
1 A u
2 A u
3 A u
4 B v
5 B v
6 B v
7 B v
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)