#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 — это здорово!