根据 pandas 中的条件计算新的列值

calculate new column values based on conditions in 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 中创建一个新列 'delta' 并让它等于 'profit' 列中当前值和先前值之间的增量。但我希望仅在 'profit_date' 中的第一个日期等于 df_deals 数据框的 'deal_date' 列中的日期并且增量计算中的前一个值始终为'profit_date' 中的第一个日期与 'deals_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

下次您应该提供更好的数据,以便更轻松地提供帮助(创建数据框以便我们可以复制粘贴您的代码)。

我认为这段代码可以满足您的需求:

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

希望对您有所帮助