full.FareCut.head()还有值,但是full['FareCut'].head()找不到值。这个重现不出来。
能把从读取文件开始能重现这个现象的所有步骤都列出来吗?
你好,我重新整理了一下问题。你能帮我看一下吗?
@demons16: 你好,整理的挺清晰的,回复有点晚,不好意思。
是这样的,dataframe中是不支持通过属性创建新的列,只能通过属性来获取列(列名符合变量名的情况下)。
也就是 full['AgeCut'] = xxx 是可以创建新的列,而 full.AgeCut是不能创建新的列的。
使用 full.AgeCut 创建新的列时,应该会报类似如下的警告:
<ipython-input-10-da4798d43d6a>:1: UserWarning: Pandas doesn't allow columns to be created via a new attribute name - see https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access
你执行的时候没报警告, 是因为在 p1 的步骤中,创建过 AgeCut 和 FareCut 列。
p3 虽然没有报错,但是其实执不执行都一样,不会对 full 的数据有影响。
你可以试试,重新进入 ipython环境,在 p1 之前执行 p3, 那样应该可以看到我上面的那个错误。
@demons16: 错误信息中的这个url: https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access
可以了解下,里面介绍了通过属性的方式来操作 dataframe的一些限制
@demons16: 补充下,对于p4 和 p5 的现象。
p4, 由于 full.AgeCut 是无法创建数据列的,所以 p4 中通过 full['AgeCut'] 获取数据列的信息报错,因为没有 AgeCut 这个列。
p5, full.AgeCut 虽然没有创建数据列,但是给 full 对象创建了一个属性(AgeCut)。
可以通过 dir(full) 看看,里面应该包含了你创建的 AgeCut 和 FareCut 属性了。
full.AgeCut 取的是 full 对象的 AgeCut 属性的值,不是 full 对象中数据矩阵中的值
@wang_yb: 非常感谢你,愿意抽时间回答我的问题。我知道我哪里错了,也知道以后如何避免了。关于在p1 之前执行 p3的时候报错问题,一开始我是看到了的,但因为有值,只是UserWarning我就没管,选择性瞎眼。你解释的非常详解,谢谢!
你好,我重新整理了一下问题,你能帮我看一下吗?
@demons16: 别用这个调试,直接用pycharm,这个会存在缓存,另外的话直接搜索pd.qcut,pdcut区别,然后自己实践看结果比我将100倍有用哈
@小小咸鱼YwY: 好的,这个区别我知道了,谢谢!