当前位置: 首页 > 知识库问答 >
问题:

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

闻人仲渊
2023-03-14

试图理解这种行为(为什么会发生;如果是故意的,那么这样做的动机是什么)

所以我创建了一个数据帧

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个答案

杜诚
2023-03-14

我认为你给熊猫数据帧对象添加了第三个属性如果你想添加名为第三的列,你必须这样做:

df['third'] = pd.DataFrame(np.random.random((4,1)))
岳英锐
2023-03-14

因为它添加第三个作为属性,所以您应该停止作为属性访问列,并始终使用df['第三个']来避免模棱两可的行为。

您应该养成使用df[col\u name]访问和分配列的习惯,这是为了避免以下问题:

df.mean = some_calc()

这里的问题是均值是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}

您可以看到您有一个项目\uu数据轴1等,但您还有一个属性'third'

 类似资料:
  • 问题内容: 想象一下,一个需要花费很长时间才能运行的python脚本,如果我在运行时对其进行修改,会发生什么?结果会有所不同吗? 问题答案: 没什么,因为Python将您的脚本预编译为PYC文件并启动它。 但是,如果发生某种异常,您可能会得到有点误导的解释,因为 X 行的代码可能与启动脚本之前的代码不同。

  • spark sql聚合操作,用于洗牌数据,即spark。sql。洗牌分区200(默认情况下)。当洗牌分区大于200时,性能会发生什么变化。 当分区数大于2000时,Spark使用不同的数据结构进行无序记账。所以,若分区的数量接近2000个,那个么将其增加到2000多个。 但是我的问题是当随机分区大于200(假设300)时会有什么行为。

  • 为什么这里两个列表的大小都是零?按照我的理解,< code>aList1.size()应该是< code>0,而< code>aList2.size()应该是< code>1。

  • 谁能给我解释一下,当我改变从find函数返回的值时,为什么原始数组中的值会改变呢?是不是有一个我缺失的概念?在执行代码之后,我将得到下面提到的输出。

  • 问题内容: 我知道Java I / O使用装饰器模式。但是我觉得我理解它的错。 请说明两个代码段之间的区别: 片段1: 该应用程序符合我的期望,并且在控制台中看到结果。 片段2: 我尝试两次包装ObjectInputStream和ObjectOutputStream: 这段代码只是挂断了。我不明白为什么。请澄清。 聚苯乙烯 这仅仅是理论问题。 更新 真正的挂断行为是因为我使用管道而发生的(根据EJ

  • 我正在以编程方式运行Mwe2工作流,为了成功运行此工作流,我需要将Terminals.xtext的referencedResource添加到GenerateYourdsl.Mwe2文件中。提到的GenerateYourdsl.mwe2文件是在我创建新项目时由Xtext生成的--我没有修改它。是否有可能从这个工作流中获取对象,用Java访问它,并将这个属性添加到工作流组件属性的语言属性中? 以下是工