当我以下列方式修改pandas数据帧时会发生什么

时间:2017-03-23 14:17:35

标签: python pandas

试图理解这种行为(为什么会发生;如果是有意的话,那么以这种方式完成它的动机是什么)

所以我创建了一个数据框

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']时会发生什么?

2 个答案:

答案 0 :(得分:6)

由于它添加了third作为属性,因此您应该停止作为属性访问列,并始终使用df['third']来避免模糊行为。

您应该养成使用df[col_name]始终访问和分配列的习惯,这是为了避免像

这样的问题
df.mean = some_calc()

这里的问题是mean是DataFrame的方法

然后你用一些计算值覆盖了一个方法。

这里的问题是,这是设计的一部分,为了方便和数据分析的大熊猫和一些早期在线视频演示显示这是一种分配到新专栏的方式,但微妙的错误可以如此普遍,以至于它真的应该被禁止并移除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'这是一个属性

答案 1 :(得分:0)

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

dataSource