Python 创建和修改空数据帧会导致不可预测的行为

Python 创建和修改空数据帧会导致不可预测的行为,python,pandas,Python,Pandas,我试图理解为什么我的代码(初始化并修改Pandas数据帧中的一个新列)行为不稳定。我的代码如下: pos = df['sign'] == 'Pos' neg = df['sign'] == 'Neg' df['signed_val'] = 0 df['signed_val'][pos] = df['abs_val'][pos] df['signed_val'][neg] = -df['abs_val'][neg] df['pos_part'] = (df['abs_val']+df['sign

我试图理解为什么我的代码(初始化并修改Pandas数据帧中的一个新列)行为不稳定。我的代码如下:

pos = df['sign'] == 'Pos'
neg = df['sign'] == 'Neg'
df['signed_val'] = 0
df['signed_val'][pos] =  df['abs_val'][pos]
df['signed_val'][neg] = -df['abs_val'][neg]
df['pos_part'] = (df['abs_val']+df['signed_val'])/2
这里,
df
是一个现有的数据框,其中包含标记为“abs_val”和“sign”的列。我的目标是创建一个新列,其中有一行“signed_val”,其中包含一个签名版本的“abs_val”

当我运行此代码时,会发生以下两种情况之一。首先,如果我将整个代码块复制并粘贴到python解释器中,
df['signed_val']
将用全零填充。或者,如果我一次复制并粘贴一行到我的python解释器中,
df['signed_val']
显示为df['abs_val']的签名版本

显然,这种行为是不可接受的。我是做错了什么,还是这是一个错误

更新

当最后一行打印出签名版本的
df['abs\u val']
时,以下代码似乎可以预期地运行:

pos = df['sign'] == 'Pos'
neg = df['sign'] == 'Neg'
df['signed_val'] = 0
df['signed_val'][pos] =  df['abs_val'][pos]
df['signed_val'][neg] = -df['abs_val'][neg]
df['signed_val']
但是,一旦运行另一个命令,
df['signed_val']
就会打印出一个零向量。下面的第三段代码可能会以可预测的方式运行,尽管我还没有对其进行过广泛的测试:

pos = df['sign'] == 'Pos'
neg = df['sign'] == 'Neg'
df['signed_val'] = numpy.nan
df['signed_val'][pos] =  df['abs_val'][pos]
df['signed_val'][neg] = -df['abs_val'][neg]
df['pos_part'] = (df['abs_val']+df['signed_val'])/2
但是,第一个代码块发生了什么


我正在使用pandas版本0.13.1和numpy版本1.8.0。

您正在执行链式作业,请参见此处:

在单个数据类型的帧上,这将始终有效;通常,在多数据类型的帧上,它不会


相反,使用索引器
loc/ix
来可靠地设置值。

您正在进行链式赋值,请参见此处:

在单个数据类型的帧上,这将始终有效;通常,在多数据类型的帧上,它不会


相反,使用索引器
loc/ix
来可靠地设置值。

您正在进行链式赋值,请参见此处:

在单个数据类型的帧上,这将始终有效;通常,在多数据类型的帧上,它不会


相反,使用索引器
loc/ix
来可靠地设置值。

您正在进行链式赋值,请参见此处:

在单个数据类型的帧上,这将始终有效;通常,在多数据类型的帧上,它不会


相反,使用索引器
loc/ix
来可靠地设置值。

我很好奇,我没有看到第一个和第二个代码块之间的差异,为什么它们的行为不同?我遗漏了什么吗?我的意思是代码
df['signed\u val'][pos]=df['abs\u val'][pos]
即使在第一个代码块中也应该工作,因为
df['signed\u val']
是一个引用,而不是副本。为什么OP说它不起作用?第一个代码块和第二个代码块之间似乎没有什么不同(除了代码块1中的最后一行)。您忽略了这一点,它只在一个数据类型的情况下工作(很明显,这不是一个数据类型的情况)。这可以复制一份;这取决于numpy是否创建视图。阅读链接索引部分。它不是python案例中的引用。这将通过pandas
\uuuu getitem\uuuu
完成。这就是为什么链式索引是隐蔽的,永远不应该使用。(也不清楚这里使用的是哪一个版本的pandas;最近的版本确实在某些情况下提供了警告)。我很好奇,我没有看到第一个和第二个代码块之间的区别,为什么它们的行为不同?我遗漏了什么吗?我的意思是代码
df['signed\u val'][pos]=df['abs\u val'][pos]
即使在第一个代码块中也应该工作,因为
df['signed\u val']
是一个引用,而不是副本。为什么OP说它不起作用?第一个代码块和第二个代码块之间似乎没有什么不同(除了代码块1中的最后一行)。您忽略了这一点,它只在一个数据类型的情况下工作(很明显,这不是一个数据类型的情况)。这可以复制一份;这取决于numpy是否创建视图。阅读链接索引部分。它不是python案例中的引用。这将通过pandas
\uuuu getitem\uuuu
完成。这就是为什么链式索引是隐蔽的,永远不应该使用。(也不清楚这里使用的是哪一个版本的pandas;最近的版本确实在某些情况下提供了警告)。我很好奇,我没有看到第一个和第二个代码块之间的区别,为什么它们的行为不同?我遗漏了什么吗?我的意思是代码
df['signed\u val'][pos]=df['abs\u val'][pos]
即使在第一个代码块中也应该工作,因为
df['signed\u val']
是一个引用,而不是副本。为什么OP说它不起作用?第一个代码块和第二个代码块之间似乎没有什么不同(除了代码块1中的最后一行)。您忽略了这一点,它只在一个数据类型的情况下工作(很明显,这不是一个数据类型的情况)。这可以复制一份;这取决于numpy是否创建视图。阅读链接索引部分。它不是python案例中的引用。这将通过pandas
\uuuu getitem\uuuu
完成。这就是为什么链式索引是隐蔽的,永远不应该使用。(也不清楚这里使用的是哪一个版本的pandas;最近的版本确实在某些情况下提供了警告)。我很好奇,我没有看到第一个和第二个代码块之间的区别,为什么它们的行为不同?我遗漏了什么吗?我的意思是代码
df['signed\u val'][pos]=df['abs\u val'][pos]
即使在第一个代码块中也应该工作,因为
df['signed\u val']
是一个引用,而不是副本。为什么OP说它不起作用?第一个代码块和第二个代码块之间似乎没有什么不同(除了代码块1中的最后一行)。您忽略了这一点,它只在一个数据类型的情况下工作(很明显,这不是一个数据类型的情况)。这可以复制一份;这取决于numpy是否创建视图。阅读链接索引部分。这不是我的推荐信