比较pandas

时间:2017-04-16 16:52:24

标签: python pandas dataframe compare

我有一个数据帧数据,如下所示:

>>> 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

非常感谢任何可能出错的建议。

1 个答案:

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