因为它添加了third
作为属性,您应该停止将列作为属性访问并始终使用df['third']
以避免模棱两可的行为。
您应该养成始终使用以下方式访问和分配列的习惯df[col_name]
,这是为了避免像这样的问题
df.mean = some_calc()
那么这里的问题是mean
是 DataFrame 的方法
因此,您已经用一些计算值覆盖了一个方法。
这里的问题是,这是为了方便而设计的一部分,用于数据分析的 pandas 书籍和一些早期的在线视频演示表明这是分配给新列的一种方式,但微妙的错误可能如此普遍,以至于它确实应该IMO 被禁止和删除
说真的,我怎么强调都不为过,停止将列作为属性引用,这是我的一个严重的问题,不幸的是我仍然看到很多发布的答案显示了这种用法
可以看到没有添加新列:
In [97]:
df.third = pd.DataFrame(np.random.random((4,1)))
df.columns
Out[97]:
Index(['a', 'b'], dtype='object')
你可以看到third
被添加为属性:
In [98]:
df.__dict__
Out[98]:
{'_data': BlockManager
Items: Index(['a', 'b'], dtype='object')
Axis 1: Int64Index([0, 1, 2, 3], dtype='int64')
FloatBlock: slice(0, 2, 1), 2 x 4, dtype: float64,
'_iloc': <pandas.core.indexing._iLocIndexer at 0x7e73b00>,
'_item_cache': {},
'is_copy': None,
'third': 0
0 0.844821
1 0.286501
2 0.459170
3 0.243452}
你可以看到你有一个Items
, __data
, Axis 1
等等,但你也有'third'
这是一个属性