我有一个数据帧数据,如下所示:
>>> 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,那么顺序将是 -1,如果 po 小于 ma,那么它是 1。我为它编写了以下代码。
data['order'][data.pop > data.ma] = -1
data['order'][data.pop < data.ma] = 1
在我运行大于 po 的 ma 后,订单值没有变化。正如表中所示,当我运行大于 ma 代码的 pop 时,一切都变成了 -1。最初,我认为一定是数据类型的错误,所以我确保两者都相同并将它们转换为 float32。即使在那之后它也没有运行。
>>> data.dtypes
stock float64
pop float32
ma float32
order int64
dtype: object
任何可能出错的建议将不胜感激。
首先,您遇到了链式索引 - 以交互方式运行此索引,您将看到警告,另请参阅此处的文档。
其次,pop
是一个数据帧方法,因此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