当我以下列方式修改熊猫数据框时会发生啥

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__dataAxis 1 等,但你也有'third' 这是一个属性

【讨论】:

【参考方案2】:

我认为您将属性 third 添加到 pandas 数据框对象 如果您想添加名称为“第三”的列,您必须这样做:

df['third'] = pd.DataFrame(np.random.random((4,1)))

【讨论】:

OP 已经在最后一行声明这行得通,OP 询问为什么 df.third = X 不起作用

以上是关于当我以下列方式修改熊猫数据框时会发生啥的主要内容,如果未能解决你的问题,请参考以下文章

为啥在附加熊猫数据框时列顺序会发生变化?

当我增加 ec2 实例的运行量大小时会发生啥

使用熊猫数据框时出错

当模型是熊猫数据框时,使 QTableView 可编辑

Scikit-learn 脚本给出的结果与教程大不相同,当我更改数据框时会出错

在熊猫中将可变长度列表保存到 HDF5