Рассчитать новые значения столбца на основе условий в pandas

У меня есть столбцы в фрейме данных pandas df_profit:

    profit_date   profit
0   01.04         70    
1   02.04         80    
2   03.04         80    
3   04.04         100   
4   05.04         120   
5   06.04         120   
6   07.04         120   
7   08.04         130   
8   09.04         140   
9   10.04         140   

И у меня есть второй фрейм данных df_deals:

    deals_date
0   03.04
1   05.04
2   06.04

Я хочу создать новый столбец «дельта» в df_profit и пусть он будет равен разнице между текущим значением и предыдущим значением в столбце «прибыль». Но я хочу, чтобы дельта рассчитывалась только после того, как первая дата в «profit_date» равна дате в столбце «deal_date» фрейма данных df_deals, а предыдущее значение в расчете дельты всегда было одинаковым и равным значению, когда первая дата в «profit_date» совпала с первой датой в «deals_date».

Итак, результат будет выглядеть так:

    profit_date   profit   delta
0   01.04         70       
1   02.04         80       
2   03.04         80       
3   04.04         100      20
4   05.04         120      40
5   06.04         120      40
6   07.04         120      40
7   08.04         130      50
8   09.04         140      60
9   10.04         140      60
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
0
30
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

В следующий раз вы должны предоставить более качественные данные, чтобы упростить помощь (создание фрейма данных, чтобы мы могли скопировать и вставить ваш код).

Я думаю, что эти коды делают то, что вы хотите:

import pandas as pd

df_profit = pd.DataFrame(columns=["profit_date", "profit"],
                         data=[
                             ["01.04", 70],
                             ["02.04", 80],
                             ["03.04", 80],
                             ["04.04", 100],
                             ["05.04", 120],
                             ["06.04", 120],
                             ["07.04", 120],
                             ["08.04", 130],
                             ["09.04", 140],
                             ["10.04", 140]])

df_deals = pd.DataFrame(columns=["deals_date"], data=["03.04", "05.04", "06.04"])

# combine both dataframes, based on date columns
df = df_profit.merge(right=df_deals, left_on="profit_date", right_on="deals_date", how="left")

# find the first value (first row with deals date) and set it to 'base'
df["base"] = df.loc[df["deals_date"].first_valid_index()]["profit"]

# calculate delta
df["delta"] = df["profit"] - df["base"]

# Remove unused values
df.loc[:df["deals_date"].first_valid_index(), "delta"] = None

# remove temporary cols
df.drop(columns=["base", "deals_date"], inplace=True)

print(df)

вывод:

  profit_date  profit  delta
0       01.04      70    NaN
1       02.04      80    NaN
2       03.04      80    NaN
3       04.04     100   20.0
4       05.04     120   40.0
5       06.04     120   40.0
6       07.04     120   40.0
7       08.04     130   50.0
8       09.04     140   60.0
9       10.04     140   60.0

Вы можете попробовать это, чтобы не получать значения NaN

start_profit = df_profit.loc[(df_profit["profit_date"] == df_deals.iloc[0][0])]
start_profit = start_profit.iloc[0][1]
for i in range(len(df_profit)):
   if int(str(df_profit.iloc[i][0]).split(".")[0]) > 3 and int(str(df_profit.iloc[i][0]).split(".")[1]) >= 4:
       df_profit.loc[i,"delta"] = df_profit.iloc[i][1]-start_profit

Надеюсь, поможет

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