我正在研究Wes McKinney的 Python for Data Analysis 。虽然我在Python 3中工作并且本书是用Python 2编写的,但这通常不是问题,如果有什么好的练习。
然而,我在第2章,第3章:美国婴儿名称1880 - 2010(第34页)上陷入了僵局。以下代码的目的是插入一个标题为“prop”的列,其中包含每年给出一个名称的婴儿部分和性别到数据框中:
def add_prop(group):
births = group.births.astype(float)
group['prop']=births/births.sum()
return group
names=names.groupby(['year','sex']).apply(add_prop)
'names'是一个包含五列的数据框('name','sex','births','year',这会增加'prop')和大约170万行。为了测试是否正确添加了prop,您可以测试比例与np.allclose(names.groupby(['year','sex']).prop.sum(), 1)
的总和大约为1。
我的问题是该功能运行不可预测。也许每15或20次运行一次,np.allclose将成立,并且该函数将正确应用于数据帧。否则np.allclose为false。另外,它在不同方面是错误的。之后,您使用此数据框来绘制按性别分列的前1000名中出生比例,并且该图表的形状会不断变化。 Some examples of graph change: 我知道问题在于如何计算和添加比例,因为数据帧的其余部分没有变化。
什么在这个例子中引入了不可预测性?虽然我怀疑它是.apply()命令,但我不确定并且不知道如何测试我的假设。有人建议我不推荐使用代码块的一部分,但Jupyter Notebook没有提出警告,我也无法在网上找到任何内容。我已经两遍了我的代码,总的来说它几乎与书的相同,并且在这个块的情况下是相同的。提前谢谢。
答案 0 :(得分:0)
我认为问题在于为prop使用float数据类型。在需要准确性的地方,浮子很糟糕。这就是为什么在书中,他说道具的总和应该加1或者#34;足够接近(但可能不完全等于)1"
我自己是python的新手,所以我不知道最好的解决方案。在数据库中,我避免使用浮点数并使用十进制数据类型。无论如何,如果我们要找到超过一百万条记录中每一条的比例,那么维持任何单一的准确性都很难。