Pandas DataFrame,迭代列并检查条件

时间:2018-04-01 09:00:59

标签: python pandas dataframe

我有产品价格的DataFrame,它有产品和日期的MultiIndex,而且列是几家商店的销售。

例如:

             d1        d2        d3        d4        d5        d6 
Date 
2000-01-03 -0.084321 -0.070914 -0.151308 -0.111111 -0.126745 -0.171419 
2000-01-04  0.014642 -0.073155 -0.029257 -0.046330 -0.095118 -0.148168 
2000-01-05 -0.086530 -0.043265 -0.060092 -0.108177 -0.160461 -0.067307 
2000-01-06  0.057364  0.028943 -0.023697 -0.080934  0.021044  0.057237 
2000-01-07 -0.017588 -0.017847 -0.002495 -0.025129  0.009427  0.009427

我想看看>的区别5%,或者< -5%,但我需要它是连续的,意思是 - 首先检查d1,如果不匹配,检查d2 ......

最终结果应为具有该字段的numpy.sign结果的新系列(因此-1表示< -5%,+1表示> 5%)

            Signal    
Date 
2000-01-03  -1
2000-01-04  -1
2000-01-05  -1
2000-01-06   1
2000-01-07   0

我正在尝试使用DataFrame的apply函数,但我无法理解如何在列上按顺序执行此操作。

有没有人知道如何解决这个问题? 感谢。

2 个答案:

答案 0 :(得分:1)

阅读文档我认为np.sign在这种情况下用于断点而不是你想要的范围。

df.apply接受一个函数(lambda或def),你也应该发送轴参数(0表示col,1表示行):

import pandas as pd

df = pd.DataFrame({'d1': {'2000-01-03': -0.08432100000000001,
  '2000-01-04': 0.014641999999999999,
  '2000-01-05': -0.08653,
  '2000-01-06': 0.047363999999999996,
  '2000-01-07': -0.017588},
 'd2': {'2000-01-03': -0.070914,
  '2000-01-04': -0.073155,
  '2000-01-05': -0.043265,
  '2000-01-06': 0.028943,
  '2000-01-07': -0.017847},
 'd3': {'2000-01-03': -0.151308,
  '2000-01-04': -0.029257,
  '2000-01-05': -0.06009199999999999,
  '2000-01-06': -0.023697,
  '2000-01-07': -0.002495},
 'd4': {'2000-01-03': -0.11111099999999999,
  '2000-01-04': -0.04633,
  '2000-01-05': -0.108177,
  '2000-01-06': -0.080934,
  '2000-01-07': -0.025129},
 'd5': {'2000-01-03': -0.126745,
  '2000-01-04': -0.095118,
  '2000-01-05': -0.160461,
  '2000-01-06': 0.021044,
  '2000-01-07': 0.009427},
 'd6': {'2000-01-03': -0.17141900000000002,
  '2000-01-04': -0.148168,
  '2000-01-05': -0.067307,
  '2000-01-06': 0.057237,
  '2000-01-07': 0.009427}})

代码:

def ret_Signal(x):
    for i in x:
        if i > 0.05:
            return 1
        elif i < -0.05:
            return -1
    return 0

df.apply(ret_Signal, axis = 1)

返回:

2000-01-03   -1
2000-01-04   -1
2000-01-05   -1
2000-01-06   -1
2000-01-07    0

答案 1 :(得分:0)

这不是最漂亮的方式,但你可以使用带有多个if语句的lambda调用apply函数,如下所示:

df['Signal'] = df.apply(lambda x: 1 if x.d1 > 0.1 else -1 if x.d2 < -0.1 else 0, axis=1)