我有一系列累积值如下:
1821, 2015-01-26 22:14:42+02:00, 24574.7
1822, 2015-01-26 22:15:05+02:00, 24574.7
1823, 2015-01-26 22:15:28+02:00, 24574.8
1824, 2015-01-26 22:15:49+02:00, 24574.9
1825, 2015-01-26 22:16:11+02:00, 24574.9
1826, 2015-01-26 22:16:34+02:00, 24576.0
1828, 2015-01-26 22:17:19+02:00, 24575.1
1829, 2015-01-26 22:17:41+02:00, 24575.2
1830, 2015-01-26 22:18:03+02:00, 24575.3
1831, 2015-01-26 22:18:25+02:00, 24575.3
问题在于,有时我得到的值对于累积的系列来说是不正常的,而值只会增加。与第1826行相同(值为24576,下一个较小)。有没有办法从Pandas Series对象中删除这些值?即当一个值超过前一个和下一个?
答案 0 :(得分:2)
您可以使用np.diff()
来计算相邻差异。差异为负的任何地方,你知道你需要删除前一行。
答案 1 :(得分:1)
这可以通过使用Pandas'boolean indexing的单行解决方案来完成。单行也使用了一些其他技巧:Pandas的map
和diff
方法以及lambda
函数。 map
用于将lambda
函数应用于所有行。需要lambda
函数来创建自定义小于时的比较,将NaN值评估为True。
以下示例说明。
免责声明:这只有在我们可以假设每一行总是大于或等于前两行的位置时才有效。换句话说:row [i]> = row [i-2]
import pandas as pd
df = pd.DataFrame({'A':['a','b','c','d','e', 'f', 'g'], 'B': [1,2,2,4,3,5,6]})
# We're going to use Pandas' diff method, telling it to take the difference 1 row back.
print df['B'].diff(1)
# Createa boolean index. We use map and a lambda function to handle the tricky case of the first row evaluating to
print df['B'].diff(1).map(lambda x: not(x<0))
# Here is the one line solution!
# Redefine df to only contain the rows that behave themselves.
df = df[df['B'].diff(1).map(lambda x: not(x<0))]
print df
答案 2 :(得分:1)
此diff
有一种内置方法:
In [30]:
pd.concat([df.head(1), df[df['cumulative value'].diff()>=0]])
Out[30]:
timestamp cumulative value
0
1821 2015-01-26 20:14:42 24574.7
1822 2015-01-26 20:15:05 24574.7
1823 2015-01-26 20:15:28 24574.8
1824 2015-01-26 20:15:49 24574.9
1825 2015-01-26 20:16:11 24574.9
1826 2015-01-26 20:16:34 24576.0
1829 2015-01-26 20:17:41 24575.2
1830 2015-01-26 20:18:03 24575.3
1831 2015-01-26 20:18:25 24575.3
修改强>
正如所指出的那样,在这里调用diff
会丢失第一行,所以我使用了一个丑陋的黑客,我将第一行与diff
的结果连接起来,所以我不会失去第一行