#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
Необходимо учитывать два условия:
- Если нет слоя с меньшей глубиной для идентификатора, то эта глубина равна толщине.
- Если есть слой с меньшей глубиной, предыдущая глубина должна быть вычтена из текущей глубины, чтобы вычислить толщину.
Результат должен выглядеть следующим образом:
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