问题描述
nums = pd.Series([1,1,2,3,4,5,6,7,8,9])
#some code here#
print(nums)
0 1
1 1
2 2
3 2
4 3
5 4
6 2
7 2
8 2
9 5
10 5
11 5
12 6
13 7
14 8
15 5
16 5
17 9
虽然nums
是顺序的,但是某些条目可以重复(请参见索引2-3和6-8)。
我正在考虑使用for循环进行迭代
for i in nums:
#check i <= i + 1#
并使用生成的布尔序列对nums
进行子集设置,但是我无法弄清楚循环的其余部分,也无法弄清楚如何访问i+1
索引的值
解决方法
我认为您正在寻找转变。与使用循环进行迭代相比,这是一种更为熊猫/蟒蛇般的解决方法。
import pandas as pd
nums = pd.Series([1,1,2,3,4,5,6,7,8,9])
size = -1 #arbitrary
while(nums.size != size): #go until don't need to remove more elements
size = nums.size
nums = nums[nums <= nums.shift(-1)].append(nums.tail(1))
print(nums.values)
,
要删除每个nums[i] <= nums[i+1]
的元素,您可以按照正确的说明建立循环。您也可以在没有问题的情况下为i+1
编制索引,例如避免使用break
索引最终元素:
import pandas as pd
import numpy as np
nums = pd.Series([1,9])
#some code here#
print(nums)
for i,n in enumerate(nums):
if i == len(nums)-1: break # avoid final index
if nums[i] <= nums[i+1]: #check
nums[i] = np.nan # mark removed elements with NaN
print(nums.dropna().astype('int64')) # remove NaNs
这将保存原始索引,并指示删除元素的位置。如果您想要一个新系列并且对原始索引不感兴趣,则还可以将元素保存在新列表中。使用NaN
s的上述解决方案的最终结果是:
5 4
14 8
17 9
dtype: int64