如何在Dataframe的多列上执行单个操作

时间:2017-08-04 16:05:31

标签: python pandas numpy dataframe

我有以下数据框:

df
>>>                                     TSLA             MSFT
2017-05-15 00:00:00+00:00                320              68
2017-05-16 00:00:00+00:00                319              69
2017-05-17 00:00:00+00:00                314              61
2017-05-18 00:00:00+00:00                313              66
2017-05-19 00:00:00+00:00                316              62
2017-05-22 00:00:00+00:00                314              65
2017-05-23 00:00:00+00:00                310              63


max_idx = df.idxmax() # returns index of max value
>>> TSLA    2017-05-15 00:00:00+00:00
>>> MSFT    2017-05-16 00:00:00+00:00

max_value = df.max() # returns max value
>>> TSLA = 320
>>> MSFT = 69

def pct_change(first, second):  # pct chg formula
    return (second-first) / first*100.00

我希望在max_value之间以及从max_idxdf.loc[max_idx:])开始的每个连续值对两列进行百分比变化。只是为了确保 百分比变化不低于5%。

Example: 
for TSLA:  320 with 319 = 2%       for MSFT: 69 with 61 = 4%
           320 with 314 = 4%                 69 with 66 = 5% 
           320 with 313 = 5%                 69 with 62 = 10%

编辑:如果您觉得难以回答,我会很高兴只提及我将用于此类操作的功能或方法类型。

  

注意:我只想确保百分比变化不低于5%。

1 个答案:

答案 0 :(得分:2)

我不确定你的真假情况,但我认为你需要这样的东西,感谢@JohnGalt:

df.apply(lambda x: ((1 - x/x.max()) > 0.05).all())

或者使用你的逻辑:

df.apply(lambda x: ((x[x.idxmax()]-x)/x[x.idxmax()]*100>5).all())

输出:

TSLA    False
MSFT    False
dtype: bool

让我们看一栏,

约翰的公式:

1 - df.TSLA/df.TSLA.max()

返回:

2017-05-15 00:00:00+00:00    0.000000
2017-05-16 00:00:00+00:00    0.003125
2017-05-17 00:00:00+00:00    0.018750
2017-05-18 00:00:00+00:00    0.021875
2017-05-19 00:00:00+00:00    0.012500
2017-05-22 00:00:00+00:00    0.018750
2017-05-23 00:00:00+00:00    0.031250
Name: TSLA, dtype: float64

如果所有这些值都大于5,则返回True,否则返回False。

我的原始公式也适用,只需要更多的计算来做与John公式相同的事情。 最后,使用lambda函数将此公式独立地应用于每个列。