当我以下列方式修改熊猫数据框时会发生啥
Posted
技术标签:
【中文标题】当我以下列方式修改熊猫数据框时会发生啥【英文标题】:what happens when I modify a pandas dataframe in the following way当我以下列方式修改熊猫数据框时会发生什么 【发布时间】:2017-08-16 03:56:38 【问题描述】:试图了解这种行为(为什么会发生;如果是故意的,那么这样做的动机是什么)
所以我创建了一个数据框
np.random.seed(0)
df = pd.DataFrame(np.random.random((4,2)))
0 1
0 0.548814 0.715189
1 0.602763 0.544883
2 0.423655 0.645894
3 0.437587 0.891773
我可以像这样引用列
df.columns = ['a','b']
df.a
0
0 0.548814
1 0.602763
2 0.423655
3 0.437587
我什至可以做,我认为是一个新的专栏
df.third = pd.DataFrame(np.random.random((4,1)))
但df
仍然是
df
0 1
0 0.548814 0.715189
1 0.602763 0.544883
2 0.423655 0.645894
3 0.437587 0.891773
但是,df.third
也存在(但我在 Spyder 的变量查看器中看不到它)
df.third
0
0 0.118274
1 0.639921
2 0.143353
3 0.944669
如果我想添加第三列,我必须执行以下操作
df['third'] = pd.DataFrame(np.random.random((4,1)))
a b third
0 0.548814 0.715189 0.568045
1 0.602763 0.544883 0.925597
2 0.423655 0.645894 0.071036
3 0.437587 0.891773 0.087129
那么,我的问题是当我执行 df.third 与 df['third'] 时发生了什么?
【问题讨论】:
【参考方案1】:因为它添加了third
作为属性,所以您应该停止将列作为属性访问,并始终使用df['third']
来避免模棱两可的行为。
你应该养成使用df[col_name]
访问和分配列的习惯,这是为了避免类似的问题
df.mean = some_calc()
这里的问题是 mean
是 DataFrame 的一种方法
所以你已经用一些计算值覆盖了一个方法。
这里的问题是,为了方便起见,这是设计的一部分,pandas for data analysis book 和一些早期的在线视频演示表明这是分配给新列的一种方式,但细微的错误可能如此普遍,以至于它真的应该被禁止和删除 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'
这是一个属性
【讨论】:
【参考方案2】:我认为您将属性 third 添加到 pandas 数据框对象 如果您想添加名称为“第三”的列,您必须这样做:
df['third'] = pd.DataFrame(np.random.random((4,1)))
【讨论】:
OP 已经在最后一行声明这行得通,OP 询问为什么df.third = X
不起作用以上是关于当我以下列方式修改熊猫数据框时会发生啥的主要内容,如果未能解决你的问题,请参考以下文章