прежде всего: спасибо за все вопросы и ответы. До сих пор я всегда находил здесь решение своих проблем. Однако со следующей проблемой я застрял:
У меня есть фрейм данных, как это:
Jan_x Feb_x Mar_x Apr_x ... driest driest_rr DMAI Station_id
0 -433 -398 -18 508 ... Mar_x 2684 37.189000 2
1 -95 -102 164 631 ... Mar_x 2732 30.568445 10
2 59 272 691 1165 ... Jan_x 1970 40.237462 12
3 30 239 696 1108 ... Feb_x 3548 43.941148 13
4 -1128 -1193 -985 -667 ... Feb_x 12715 334.828246 15
(всего 995 строк)
Первые 12 столбцов — это среднемесячные значения температуры (в 0,01 градуса), последний столбец («Station_id») — идентификатор климатических станций. Из другого кадра данных, содержащего данные об осадках, я получил самый засушливый месяц («самый засушливый») и количество осадков («самый сухой_рр»; в 0,01 мм). Наконец, «DMAI» — это годовой индекс засушливости, уже рассчитанный на предыдущем этапе. Теперь я хочу рассчитать еще один индекс засушливости (для метеорологов/климатологов: комбинированный индекс Пинна), который включает как среднегодовую температуру и осадки (уже включенные в «DMAI»), так и среднюю температуру и осадки самого засушливого месяца. Уравнение:
DMAI = P/(T+10)
PCI = 0,5 (ДМАИ+(12Pd/Td+10))
со среднегодовой температурой P,T и осадками и Pd,Td – средняя температура и осадки самого засушливого месяца. (в мм и °C соответственно)
У меня уже есть:
df['PCI'] = 0.5 * (df.loc[:,'DMAI'] +(12*(df.loc[:,'driest_rr']/100)))/(df.loc[:,'Mar_x']+10))
который работает. Однако не всегда самый сухой месяц март, мне нужен тот, который указан в графе «самый сухой».
df['PCI'] = 0.5 * (df.loc[:,'DMAI'] +(12*(df.loc[:,'driest_rr']/100)))/(df.loc[:,df_dmai.loc[:,'driest']]+10))
однако не работает.
Есть ли способ решить эту проблему?
Я нашел несколько похожих вопросов, например, этот здесь:
Как я могу выбрать определенный столбец из каждой строки в Pandas DataFrame?
Однако ответы, которые я нашел, используют либо устаревший df.lookup()
, либо обходной путь numpy, поэтому в этом случае они мне не помогают.
Вы можете использовать метод loc или iloc, вы можете найти эти методы, добавив файл . после имени вашего фрейма данных нажмите вкладку
За pandas
стоит много numpy
, поэтому обходной путь из документов pandas очень легко подключить обратно к вашему DataFrame:
In [27]: df = pd.DataFrame({'select': ['a', 'b', 'c', 'b', 'c', 'a'], 'a': range(6), 'b': range(6, 12), 'c': range(12, 18)})
In [28]: idx, cols = pd.factorize(df['select'])
In [29]: df['chosen'] = df.reindex(cols, axis=1).to_numpy()[np.arange(len(df)), idx]
In [30]: df
Out[30]:
select a b c chosen
0 a 0 6 12 0
1 b 1 7 13 7
2 c 2 8 14 14
3 b 3 9 15 9
4 c 4 10 16 16
5 a 5 11 17 5