【问题标题】:How to perform single operation on Multiple columns of Dataframe如何对 Dataframe 的多列执行单个操作
【发布时间】:2017-08-04 16:05:31
【问题描述】:

我有以下数据框:

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_idx (df.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%。

【问题讨论】:

  • 你能给出你预期的输出吗?我也没有看到所有这些数字都匹配。例如不应该(69-61)/61 == 0.101
  • % 更改仅用于示例目的,我只是想要如何执行此类操作的方式,输出可以是任何东西,只要它承认 % 更改低于 5% @Psidom
  • @JohnGalt 仅用于示例目的。
  • 100.*(1 - df/df.max()),然后用df.idxmax()限制?
  • 所以你希望答案类似于TSLA: True, MSFT: False

标签: python pandas numpy dataframe


【解决方案1】:

我不确定你的真/假条件,但我认为你需要这样的东西,感谢@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。

我的原始公式也有效,只是需要更多的计算来做与约翰公式相同的事情。 最后,使用 lambda 函数将这个公式独立地应用于每一列。

【讨论】:

  • ((1 - df/df.max()) > 0.05).all() 甚至(df/df.max() < 0.95).all() 怎么样?
  • @ScottBoston 你能详细说明一下吗,这么长的线性方程很难理解。
  • @ScottBoston 我很感激。由于是熊猫的新手,因此需要一些时间才能弄清楚您的答案,谢谢! :)
  • @JohnGalt,感谢您帮助使答案看起来更简单!
  • 不客气。快乐编码。 Pandas 文档实际上非常好。阅读cookbook section 以获得良好的开端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 2020-11-29
  • 1970-01-01
  • 2020-06-15
  • 2014-07-20
  • 1970-01-01
相关资源
最近更新 更多