Как я могу проверить, учитывая фрейм данных, что значения столбца находятся в порядке возрастания без какого-либо пропущенного числа?

#python #pandas #function #dataframe #data-manipulation

#python #pandas #функция #фрейм данных #манипулирование данными

Вопрос:

У меня есть фрейм данных, который имеет такие значения :

 Number 
1
2
3
4
5
6
7
8
9
10
12
13
14
15
16
18
20
21
22
  

Используя отсортированную функцию pandas, у меня есть значения, которые увеличиваются, но я хочу проверить и определить, есть ли какие-либо пропущенные значения, и в этом случае сообщить о начале и конце последовательного набора значений.Например, в этом случае он должен возвращать [1,10],[12,16],[20,22]. Я хочу вставить здесь, например, 18, даже если оно есть, но оно не является последовательным. Есть ли какие-либо рекомендации о том, как подойти к этой проблеме?

Ответ №1:

Вы можете агрегировать, сравнивая различия для не равных 1 с кумулятивной суммой и получая минимальные и максимальные значения, удаляя строки с такими же минимальными и максимальными, как здесь 18 , и в последний раз преобразовывать во вложенные списки:

 df1 = df.groupby(df['Number'].diff().ne(1).cumsum())['Number'].agg(['min','max'])
print (df1)
        min  max
Number          
1         1   10
2        12   16
3        18   18
4        20   22


df1 = df1[df1['min'].ne(df1['max'])]
print (df1)
        min  max
Number          
1         1   10
2        12   16
4        20   22


out = [list(x) for x in df1.to_numpy()]
print (out)
[[1, 10], [12, 16], [20, 22]]
  

Комментарии:

1. большое вам спасибо. Это отлично работает. И спасибо, что представили .ne() . Я вообще этого не знал.

Ответ №2:

Вы могли бы начать с определения групп с последовательными значениями и взять первое и последнее значения этих групп. Затем удалите те группы, которые содержат только одно значение (as 18 ) и преобразуйте в список:

 g = df.Number.diff().fillna(1).ne(1).cumsum()
out = df.groupby(g).nth((0,-1))
out[out.index.duplicated(False)].groupby(level=0).agg(list).Number.tolist()
# [[1, 10], [12, 16], [20, 22]]

   
  

Комментарии:

1. Спасибо. Я хотел бы принять два ответа. Это тоже хорошо работает. Опять же, узнал два способа решения проблемы:)) Несколько дней в stackoverflow — это здорово!