【发布时间】:2014-03-26 01:39:20
【问题描述】:
我试图理解为什么我的代码(它初始化然后修改 Pandas DataFrame 中的一个新列)表现异常。我的代码如下:
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 是一个现有的 DataFrame,其中包含标记为“abs_val”和“sign”的列。我的目标是创建一个新列,其中包含一个额外的行“signed_val”,其中包含“abs_val”的签名版本。
当我运行此代码时,会发生两种情况之一。首先,如果我将整个代码块复制并粘贴到我的 python 解释器中,df['signed_val'] 将被全零填充。或者,如果我一次将一行复制并粘贴到我的 python 解释器中,df['signed_val'] 似乎给出了df['abs_val'] 的签名版本。
显然,这种行为是不可接受的。我在这里做错了什么,还是这是一个错误?
更新:
当最后一行打印出df['abs_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 版。
【问题讨论】: