我无法解释数据框架的不一致性。在下文中,我不是在寻找一种解决方法(已经找到了解决方法),而是解释了引擎盖下的内容以及它如何解释输出。
我使用python和pandas谈过的一位同事拥有一个包含12,000行的数据框“数据”。 “data”有一列“length”,其中包含0到20之间的数字。她希望将日期帧按长度范围划分为组:组1中为0到9,组2中为9到14,组3中为15或更多。她的解决方案是添加另一列“group”,并用适当的值填充它。她写了以下代码:
data['group'] = np.nan
mask = data['length'] < 10;
data['group'][mask] = 1;
mask2 = (data['length'] > 9) & (data['phraseLength'] < 15);
data['group'][mask2] = 2;
mask3 = data['length'] > 14;
data['group'][mask3] = 3;
当然,这段代码并不好。它不好的原因是因为你在运行时不知道例如data['group'][mask3]
是一个视图,因此实际上是改变了数据帧,还是一个副本,因此数据帧将保持不变。我花了一些时间辞职向她解释,因为她正确地指出她正在做一个任务,而不是一个选择,所以操作应该总是返回一个视图。
但那不是奇怪的部分。甚至我无法理解的部分是: 执行这组操作后,我们验证了分配以两种不同的方式进行:
在控制台中输入data
并检查数据框摘要。它告诉我们,我们有几千个空值。空值的数量与mask3
的大小相同,因此我们假设最后一次分配是在副本上而不是在视图上进行的。
输入data.group.value_counts()
。返回3个值:1,2和3(惊讶)然后我们输入data.group.value_counts.sum()
,总计达到12,000!
因此,通过方法2,组列不包含空值和我们希望它具有的所有值。但是通过方法1 - 它没有!
任何人都能解释一下吗?
答案 0 :(得分:0)
请参阅文档here。
你不想用这种方式设置值,正是因为你指出的原因;因为你不知道它是否是一个视图,你不知道你实际上是在改变数据。 0.13会提示/警告您正在尝试这样做,但最简单/最好只能访问:
data.loc[mask3,'group'] = 3
这将保证你的inite setitem