Python: условное вычитание

#python #pandas #conditional-statements

#python #pandas #условные операторы

Вопрос:

Моя цель — вычислить толщину [м] каждого слоя для каждого идентификатора на основе глубины [м] каждого слоя. Ниже приведен фрейм данных, похожий на мой.

 eID = [1,1,1,2,2,3,3,3,3]
depth = [0.35,1.5,3.0,0.75,2.0,0.2,0.8,1.7,3.5]
dictex ={"id":eID,"depth [m]":depth}
dfe = pd.DataFrame(dictex)
print(dfe)

   id  depth [m]
0   1       0.35
1   1       1.50
2   1       3.00
3   2       0.75
4   2       2.00
5   3       0.20
6   3       0.80
7   3       1.70
8   3       3.50
  

Необходимо учитывать два условия:

  1. Если нет слоя с меньшей глубиной для идентификатора, то эта глубина равна толщине.
  2. Если есть слой с меньшей глубиной, предыдущая глубина должна быть вычтена из текущей глубины, чтобы вычислить толщину.

Результат должен выглядеть следующим образом:

    id  depth [m]  thickness [m]
0   1       0.35           0.35
1   1       1.50           1.15
2   1       3.00           1.50
3   2       0.75           0.75
4   2       2.00           1.25
5   3       0.20           0.20
6   3       0.80           0.60
7   3       1.70           0.90
8   3       3.50           1.80
  

Я пробовал работать с «groupby», «np.where» и циклом for с if-условиями, но, к сожалению, я не смог заставить его работать.

Любая помощь была бы высоко оценена!

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

1. Не могли бы вы поделиться кодом, который вы пробовали до сих пор?

Ответ №1:

Если значения отсортированы по группам, используйте DataFrameGroupBy.diff с заменой первых значений для групп на Series.fillna исходными значениями:

 dfe['thickness [m]s'] = dfe.groupby('id')['depth [m]'].diff().fillna(dfe['depth [m]'])
print (dfe)
   id  depth [m]  thickness [m]s
0   1       0.35            0.35
1   1       1.50            1.15
2   1       3.00            1.50
3   2       0.75            0.75
4   2       2.00            1.25
5   3       0.20            0.20
6   3       0.80            0.60
7   3       1.70            0.90
8   3       3.50            1.80