Я конвертирую свой excel в python, ниже приведены строки в excel
Символ (столбец B): столбец имеет разные символы
Дата (столбец C): столбец имеет дату со временем
Цена (столбец D): в столбце указана цена
Нижний минимум (столбец E): в столбце есть упоминание «Нижний минимум» или пустые ячейки.
Нижние значения (столбец F): столбец имеет эту формулу в ячейке F2 -
"ЕСЛИ(B2<>B1,D2,IF(E2="Нижний минимум",D2,F1))"
Я пытаюсь преобразовать формулу в F2 с помощью pandan Dataframe и применить ее к группе в соответствии со столбцом символов:
создал mod_df DataFrame для вышеупомянутых столбцов:
mod_df['Lower_Value'] = np.where(mod_df['Символ'] != mod_df['Символ'].shift(1),mod_df['Цена'] ,np.where(mod_df['Нижний минимум'] == 'Нижний минимум', mod_df['Цена'], mod_df['Ниже_значение'].shift(1)))
Я получаю эту ошибку: KeyError: 'Lower_Value', может ли кто-нибудь предложить, как это исправить.
data= {'Symbol': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'],
'Date': ['2023-05-12 16:00:00', '2023-05-15 15:00:00', '2023-05-15 22:00:00', '2023-05-16 07:00:00',
'2023-05-16 14:00:00', '2023-05-17 07:00:00', '2023-05-17 20:00:00', '2023-05-18 02:00:00'],
'Price': [0.89845,0.90065,0.90042,0.89841,0.89462,0.89437,0.89455,0.89248],
'Lower Low': ['', '', '', '', '', 'Lower Low', '', ''],
'Lower Value': [0.89845, 0.89845, 0.89845, 0.89845, 0.89845, 0.89437, 0.89437, 0.89437],
}
mod_df = pd.DataFrame(data)
print(mod_df)
Dataframe:
**********
Symbol Date Price Lower Low
A 12-05-2023 16:00:00 0.89845
A 15-05-2023 15:00:00 0.90065
A 15-05-2023 22:00:00 0.90042
A 16-05-2023 07:00:00 0.89841
A 16-05-2023 14:00:00 0.89462
A 17-05-2023 07:00:00 0.89437 Lower Low
A 17-05-2023 20:00:00 0.89455
A 18-05-2023 02:00:00 0.89248
Required Output:
****************
Symbol Date Price Lower Low Lower Value
A 12-05-2023 16:00:00 0.89845 0.89845
A 15-05-2023 15:00:00 0.90065 0.89845
A 15-05-2023 22:00:00 0.90042 0.89845
A 16-05-2023 07:00:00 0.89841 0.89845
A 16-05-2023 14:00:00 0.89462 0.89845
A 17-05-2023 07:00:00 0.89437 Lower Low 0.89437
A 17-05-2023 20:00:00 0.89455 0.89437
A 18-05-2023 02:00:00 0.89248 0.89437






Предполагая, что вы создали свой mod_df DataFrame из файла Excel точно так, как вы написали в своем вопросе, у вас просто нет ключа с именем Lower_Value. Измените его на Lower_Values, и он должен правильно набираться.
ОТРЕДАКТИРОВАНО: Вот обновленный пример, который соответствует требуемому результату с учетом данных вашего примера.
import pandas as pd
import numpy as np
data= {'Symbol': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'],
'Date': ['2023-05-12 16:00:00', '2023-05-15 15:00:00', '2023-05-15 22:00:00', '2023-05-16 07:00:00',
'2023-05-16 14:00:00', '2023-05-17 07:00:00', '2023-05-17 20:00:00', '2023-05-18 02:00:00'],
'Price': [0.89845,0.90065,0.90042,0.89841,0.89462,0.89437,0.89455,0.89248],
'Lower Low': ['', '', '', '', '', 'Lower Low', '', ''],
'Lower Value': [0.89845, 0.89845, 0.89845, 0.89845, 0.89845, 0.89437, 0.89437, 0.89437],
}
mod_df = pd.DataFrame(data)
mod_df.pop('Lower Value')
## This is your starting DataFrame without the "Lower Value" column
print("STARTING DF\n", mod_df)
## Instantiate the "Lower_Value" column
mod_df["Lower Value"] = np.nan
print("\nNOW HAS NEW COLUMN\n", mod_df)
## Now use your logic to populate the "Lower Value" column
mod_df['Lower Value'] = np.where(mod_df['Symbol'] != mod_df['Symbol'].shift(1),
mod_df['Price'],
np.where(mod_df['Lower Low'] == 'Lower Low',
mod_df['Price'],
mod_df['Lower Value'].shift(1)))
## Current logic doesn't fill in the entire column, use this to forward-fill the values
mod_df = mod_df.fillna(method='ffill')
print("\nTARGET OUTPUT\n", mod_df)
Производит:
STARTING DF
Symbol Date Price Lower Low
0 A 2023-05-12 16:00:00 0.89845
1 A 2023-05-15 15:00:00 0.90065
2 A 2023-05-15 22:00:00 0.90042
3 A 2023-05-16 07:00:00 0.89841
4 A 2023-05-16 14:00:00 0.89462
5 A 2023-05-17 07:00:00 0.89437 Lower Low
6 A 2023-05-17 20:00:00 0.89455
7 A 2023-05-18 02:00:00 0.89248
NOW HAS NEW COLUMN
Symbol Date Price Lower Low Lower Value
0 A 2023-05-12 16:00:00 0.89845 NaN
1 A 2023-05-15 15:00:00 0.90065 NaN
2 A 2023-05-15 22:00:00 0.90042 NaN
3 A 2023-05-16 07:00:00 0.89841 NaN
4 A 2023-05-16 14:00:00 0.89462 NaN
5 A 2023-05-17 07:00:00 0.89437 Lower Low NaN
6 A 2023-05-17 20:00:00 0.89455 NaN
7 A 2023-05-18 02:00:00 0.89248 NaN
TARGET OUTPUT
Symbol Date Price Lower Low Lower Value
0 A 2023-05-12 16:00:00 0.89845 0.89845
1 A 2023-05-15 15:00:00 0.90065 0.89845
2 A 2023-05-15 22:00:00 0.90042 0.89845
3 A 2023-05-16 07:00:00 0.89841 0.89845
4 A 2023-05-16 14:00:00 0.89462 0.89845
5 A 2023-05-17 07:00:00 0.89437 Lower Low 0.89437
6 A 2023-05-17 20:00:00 0.89455 0.89437
7 A 2023-05-18 02:00:00 0.89248 0.89437
Сообщение об ошибке ясно в том, что вы пытаетесь использовать несуществующий ключ. Вы создали экземпляр столбца Lower_Value или пытаетесь создать его, используя эту формулу? Если это последнее, то ключевая ошибка исходит от mod_df['Lower_Value'].shift(1), поскольку этого столбца еще не существует.
Я пытаюсь создать «mod_df ['Lower_Value']», используя эту формулу, так как я сделал это в Excel. «Нижние значения» (столбец F) Ячейка F2 — «ЕСЛИ (B2<>B1,D2,IF(E2 = "Нижний минимум",D2,F1))». Не могли бы вы подсказать, как это сделать в pandas.
Если вы разместите несколько примеров данных, а также свой полный текущий код для создания вашего mod_df, это увеличит шансы, что кто-то сможет вам помочь.
Спасибо, я создал фрейм данных.
Для тех, кто проголосовал за этот ответ, было бы разумно объяснить, почему вы проголосовали за работающее решение.
Это не было рабочим решением, пока вы не опубликовали редактирование, а раздел над редактированием неверен и должен быть удален IMO.
Учитывая информацию в исходном посте, опечатка в ключе была наиболее вероятным решением. Если кто-то думал, что это неправильно, возможно, они должны были предложить альтернативное решение.
Спасибо, это решение дало мне требуемый результат.
В excel имя столбца «Нижние значения» в пандах. Я создал фрейм данных «mod_df», а mod_df['Lower_Value'] создан для применения той же формулы, и я получаю эту ошибку.