【问题标题】:Pandas filtering values in dataframe熊猫过滤数据框中的值
【发布时间】:2014-02-25 03:39:12
【问题描述】:

我有这个数据框。这些列代表每日 EURUSD 价格的高点和低点:

df.low                                            df.high
2013-01-17 16:00:00    1.33394                    2013-01-17 20:00:00    1.33874
2013-01-18 18:00:00    1.32805                    2013-01-18 09:00:00    1.33983
2013-01-21 00:00:00    1.32962                    2013-01-21 09:00:00    1.33321
2013-01-22 11:00:00    1.32667                    2013-01-22 09:00:00    1.33715
2013-01-23 17:00:00    1.32645                    2013-01-23 14:00:00    1.33545
2013-01-24 10:00:00    1.32860                    2013-01-24 18:00:00    1.33926
2013-01-25 04:00:00    1.33497                    2013-01-25 17:00:00    1.34783
2013-01-28 10:00:00    1.34246                    2013-01-28 16:00:00    1.34771
2013-01-29 13:00:00    1.34143                    2013-01-29 21:00:00    1.34972
2013-01-30 08:00:00    1.34820                    2013-01-30 21:00:00    1.35873
2013-01-31 13:00:00    1.35411                    2013-01-31 17:00:00    1.35944

我将它们总结为第三列 (df.extremes)。

df.extremes  
2013-01-17 16:00:00    1.33394 
2013-01-17 20:00:00    1.33874
2013-01-18 18:00:00    1.32805
2013-01-18 09:00:00    1.33983
2013-01-21 00:00:00    1.32962
2013-01-21 09:00:00    1.33321
2013-01-22 09:00:00    1.33715
2013-01-22 11:00:00    1.32667
2013-01-23 14:00:00    1.33545
2013-01-23 17:00:00    1.32645
2013-01-24 10:00:00    1.32860
2013-01-24 18:00:00    1.33926 
2013-01-25 04:00:00    1.33497
2013-01-25 17:00:00    1.34783
2013-01-28 10:00:00    1.34246
2013-01-28 16:00:00    1.34771 
2013-01-29 13:00:00    1.34143
2013-01-29 21:00:00    1.34972
2013-01-30 08:00:00    1.34820
2013-01-30 21:00:00    1.35873
2013-01-31 13:00:00    1.35411
2013-01-31 17:00:00    1.35944

但现在我想从 df.extremes 中过滤一些值。 为了解释过滤什么,我尝试使用这个“伪代码”:

IF following the index we move from: previous df.low --> df.low --> df.high:
    IF df.low > previous df.low: delete df.low
    IF df.low < previous df.low: delete previous df.low

如果我尝试使用 for 循环来解决这个问题,它会给我一个 KeyError: 1.3339399999999999。

day = df.groupby(pd.TimeGrouper('D'))

is_day_min = day.extremes.apply(lambda x: x == x.min())  

for i in df.extremes:
    if is_day_min[i] == True and is_day_min[i+1] == True:
        if df.extremes[i] > df.extremes[i+1]:
            del df.extremes[i]   


for i in df.extremes:
    if is_day_min[i] == True and is_day_min[i+1] == True:
        if df.extremes[i] < df.extremes[i+1]:
            del df.extremes[i+1]  

如何过滤/删除我在伪代码中解释的值?
我正在努力处理索引和布尔值,但我无法解决这个问题。我强烈怀疑我需要使用 lambda 函数,但我不知道如何应用它。所以请原谅我尝试这个时间太长了。希望我已经足够清楚了。

【问题讨论】:

  • 样本输出应该可以帮助人们回答你
  • 添加了一些有用的东西(我希望)来理解。
  • 您概述的例程听起来好像只会为您提供整个数据帧中最低的每日最低价。那不可能是你所追求的。您能否向我们展示您希望通过您展示的数据获得什么输出?

标签: python pandas filtering


【解决方案1】:

您真正缺少的只是一种以矢量化方式表达“先前低点”的方式。拼写为df['low'].shift(-1)。一旦你有了它,它只是:

prev = df.low.shift(-1)
filtered_df = df[~((df.low > prev) | (df.low < prev))]

【讨论】:

  • 你明白了!这太容易了,我无法想象!我尝试使用摆动,但我从未想过将负整数作为参数。最后一个问题,波浪号怎么打,波浪号是什么意思?
  • @Cuz Shift-`,它是 qwerty 键盘上 1 左侧的键。这意味着complement。由于df[(df.low &gt; prev) | (df.low &lt; prev)]True 任何我们想要排除的元素,我们用~ 反转所有布尔值以选择我们想要保留的所有元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2013-06-09
  • 1970-01-01
  • 2019-05-21
  • 2020-08-16
  • 1970-01-01
  • 2021-05-23
相关资源
最近更新 更多