查找和删除Python中未按顺序排列的条目

问题描述

我有一个包含n个元素的系列。对于每个n,n必须为

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