Python 在数据帧中筛选值
我有这个数据框。这些列表示每日欧元/美元价格的高点和低点:Python 在数据帧中筛选值,python,pandas,filtering,Python,Pandas,Filtering,我有这个数据框。这些列表示每日欧元/美元价格的高点和低点: 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
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中过滤一些值。
为了解释要过滤什么,我尝试使用这个“伪代码”:
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
如果遵循我们从中移动的索引:上一个df.low-->df.low-->df.high:
如果df.low>上一个df.low:删除df.low
如果df.low<先前的df.low:删除先前的df.low
如果我尝试用for循环解决这个问题,它会给我一个keyrerror:1.33393999999999
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]
day=df.groupby(pd.TimeGrouper('D'))
is_day_min=day.extremes.apply(lambda x:x==x.min())
对于df.extrements中的i:
如果is_day_min[i]==真且is_day_min[i+1]==真:
如果df.extremes[i]>df.extremes[i+1]:
del df.极值[i]
对于df.extrements中的i:
如果is_day_min[i]==真且is_day_min[i+1]==真:
如果df.极值[i]
如何过滤/删除我在伪代码中解释的值?我正在为索引和bools而挣扎,但我无法解决这个问题。我强烈怀疑我需要使用lambda函数,但我不知道如何应用它。所以请发发慈悲,我试这个太久了。希望我说得够清楚 你真正缺少的是一种以矢量化方式表达“先前低点”的方式。拼写为
df['low'].shift(-1)
。一旦你做到了这一点,它只是:
prev = df.low.shift(-1)
filtered_df = df[~((df.low > prev) | (df.low < prev))]
prev=df.low.shift(-1)
过滤的_df=df[~(df.low>prev)|(df.low
Sample output应该可以帮助回答您的人添加一些有用的(我希望)理解的内容。您概述的例程听起来好像只会给您提供整个数据帧中最低的每日低点。那不可能是你想要的。你能给我们展示一下你所展示的数据期望得到什么样的输出吗?你做到了!这太容易了,我简直无法想象!我试着使用秋千,但我从来没有想过把一个负整数作为参数。最后一个问题你如何输入tilde以及tilde的含义是什么?@CuzShift-`
,它是qwerty键盘上1
左边的键。这意味着。由于df[(df.low>prev)|(df.low
是True
只要有我们想要排除的元素,我们就用~
反转所有布尔值来选择我们想要保留的所有元素。
prev = df.low.shift(-1)
filtered_df = df[~((df.low > prev) | (df.low < prev))]