#python #pandas #dataframe #loops #loc
#питон #панды #фрейм данных #петли #панды-лок
Вопрос:
У меня есть фрейм данных, который является частью более широкого скрипта на Python со следующими характеристиками:
- Указатель
dtype='datetime64[ns]', length=365, freq='D'
- суточные значения для различных параметров
- значение по умолчанию для DOY 1
- пара значений, которые я ранее рассчитал для некоторых конкретных дат.
На сегодняшний день структура фрейма данных выглядит примерно так:
col1 col2 col3 col4 Condition value to calculate 2018-01-01 5.0 0.853232 0.992774 0.65377 0.0 0.65429 2018-01-02 0.4 0.004652 0.992774 0.65377 0.0 NaN 2018-01-03 0.0 0.000000 0.992774 0.65377 0.0 NaN 2018-01-04 0.0 0.000000 0.992774 0.65377 1.0 0.33456 2018-01-05 0.4 0.004652 0.992774 0.65377 0.0 NaN ... ... ... ... ... ...
Столбец «условие» использовался для присвоения значений в определенное время в последнем столбце
Пропущенные значения в последнем столбце должны быть рассчитаны с использованием данных из столбцов 1-4, используя значения предыдущего DOY из обоих столбцов 1-4 и из того же столбца значения, которое должно быть рассчитано.
Кроме того, в случае, если значение уже присутствует в определенном DOY, формула должна быть сброшена, чтобы начать расчет с использованием ранее добавленной стоимости.
Я не уверен, как включить это в цикл для выполнения операции, или есть ли другие альтернативы для решения этой части кода, над которой я работаю.
Комментарии:
1. Я не уверен, что полностью понял проблему. Было бы полезно понять алгоритм, необходимый для вычисления последнего столбца. Похоже, вам нужно что — то вроде этого: для индекса строка в df.iterrows(): start_row = index — n end_row = inde-m other_rows = df.loc[start_row:end_row] столбец compute_last_column(строка, другие строки)
2. @Cr4zyTun4 это на самом деле не алгоритм, а просто формула для оценки эрозии почвы (в частности, шероховатости почвы). Расчет сложнее, так как механические операции могут повлиять на ежедневные значения, на которые влияют параметры предыдущего дня, поэтому расчет должен быть примерно таким
value at day x = col1(x-1)*col2(x-1)-col3(x-1)*col4(x-1)
3. Хорошо, круто, вы поняли подход iterrow() или вам нужно, чтобы я набросал какой-нибудь код?
4. Я бы попросил вас о помощи, потому что я не совсем уверен, что понял, как работает iterrows()
5. возможно, рассчитать его для каждого обычного дня, а затем использовать
shift()
для перемещения всех значений на одну строку вниз, чтобы поместить результат в следующую дату.
Ответ №1:
Похоже, вам нужно что-то вроде этого: значение def compute_value(предыдущая строка, строка):
for index, row in df.iterrows(): if indexgt;0: previous_row = df.iloc[index-1] row['value to calculate'] = previous_row['col1'] * previous_row['col2'] - previous_row['col3'] * previous_row['col4']
Вот как вы повторяете, но не уверены, что полностью поняли условие, и не уверены, что вы имели в виду, дайте мне знать, если я смогу расширить
Кроме того, в случае, если значение уже присутствует в определенном DOY, формула должна быть сброшена, чтобы начать расчет с использованием ранее добавленной стоимости.
Комментарии:
1. Рад, что это было полезно! Удачной работы!
2. Спасибо большое, я делаю некоторые изменения, чтобы заставить его работать, как преобразование DatetimeIndex в дой избежать
TypeError: Addition/subtraction of integers and integer-arrays with Timestamp is no longer supported. Instead of adding/subtracting 'n', use 'n * obj.freq'
, есть одна вещь, которую я хотел попросить вашего (или кто-то еще читает) справка: в результате я пытаюсь вычислить на основе значений столбцов от 1 до 4 предыдущего дня, а также на значение, полученное от предыдущего дня того же результата, я пытаюсь вычислить.