我有一个数据帧数据,如下所示:
>>> data.head(10)
stock pop ma order
Date
2016-01-04 325.316 82.0 NaN -1
2016-01-11 320.036 83.0 NaN -1
2016-01-18 299.169 79.0 82.5 -1
2016-01-25 296.579 84.0 81.0 -1
2016-02-01 295.334 82.0 81.5 -1
2016-02-08 309.777 81.0 83.0 -1
2016-02-15 317.397 75.0 81.5 -1
2016-02-22 328.005 80.0 78.0 -1
2016-02-29 315.504 81.0 77.5 -1
2016-03-07 328.802 81.0 80.5 -1
所以我想将data.po与data.ma进行比较。如果po大于ma,那么order将为-1,如果po小于ma则为1.我为它编写了以下代码。
data['order'][data.pop > data.ma] = -1
data['order'][data.pop < data.ma] = 1
在我运行ma大于po之后,订单值没有变化。如表中所示,当我运行pop大于ma代码时,一切都变为-1。最初,我认为它必须是数据类型的错误,所以我确保两者都相同并将它们都转换为float32。在那之后它甚至没有运行。
>>> data.dtypes
stock float64
pop float32
ma float32
order int64
dtype: object
非常感谢任何可能出错的建议。
答案 0 :(得分:2)
首先,您正在使用链式索引 - 以交互方式运行此操作,您会看到警告,另请参阅文档here。
其次,pop
是一个DataFrame方法,因此data.pop
实际上是返回该方法,而不是列名。访问该列的安全方法是data['pop']
。
所以你可以这样写:
data.loc[data['pop'] > data['ma'], 'order'] = -1
data.loc[data['pop'] < data['ma'], 'order'] = 1
data
stock pop ma order
Date
2016-01-04 325.316 82.0 NaN -1
2016-01-11 320.036 83.0 NaN -1
2016-01-18 299.169 79.0 82.5 1
2016-01-25 296.579 84.0 81.0 -1
2016-02-01 295.334 82.0 81.5 -1
2016-02-08 309.777 81.0 83.0 1
2016-02-15 317.397 75.0 81.5 1
2016-02-22 328.005 80.0 78.0 -1
2016-02-29 315.504 81.0 77.5 -1
2016-03-07 328.802 81.0 80.5 -1