Панды: преобразование столбца excel в панды

Я конвертирую свой 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     
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что вы создали свой 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

В excel имя столбца «Нижние значения» в пандах. Я создал фрейм данных «mod_df», а mod_df['Lower_Value'] создан для применения той же формулы, и я получаю эту ошибку.

Gopinathan 14.06.2023 17:33

Сообщение об ошибке ясно в том, что вы пытаетесь использовать несуществующий ключ. Вы создали экземпляр столбца Lower_Value или пытаетесь создать его, используя эту формулу? Если это последнее, то ключевая ошибка исходит от mod_df['Lower_Value'].shift(1), поскольку этого столбца еще не существует.

astroChance 14.06.2023 18:29

Я пытаюсь создать «mod_df ['Lower_Value']», используя эту формулу, так как я сделал это в Excel. «Нижние значения» (столбец F) Ячейка F2 — «ЕСЛИ (B2<>B1,D2,IF(E2 = "Нижний минимум",D2,F1))». Не могли бы вы подсказать, как это сделать в pandas.

Gopinathan 14.06.2023 18:46

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

astroChance 14.06.2023 19:03

Спасибо, я создал фрейм данных.

Gopinathan 14.06.2023 19:46

Для тех, кто проголосовал за этот ответ, было бы разумно объяснить, почему вы проголосовали за работающее решение.

astroChance 15.06.2023 04:45

Это не было рабочим решением, пока вы не опубликовали редактирование, а раздел над редактированием неверен и должен быть удален IMO.

BigBen 15.06.2023 23:16

Учитывая информацию в исходном посте, опечатка в ключе была наиболее вероятным решением. Если кто-то думал, что это неправильно, возможно, они должны были предложить альтернативное решение.

astroChance 16.06.2023 04:34

Спасибо, это решение дало мне требуемый результат.

Gopinathan 16.06.2023 09:07

Другие вопросы по теме