根据数据框中的相应数字从数据框中减去数字

Subtract number from dataframe depending on a corresponding number in the dataframe

我有一个 2 列的数据框,比如 df:

 year       cases
 1.1         12
 1.2         14
 1.4         19
 1.6         23
 1.6         14
 2.1         26
 2.5         27
 2.7         35
 3.1         21
 3.3         24
 3.8         28

和虚假案例列表,比如 f

 f = [3,4,8]

我想写一个代码,使得每+1年,案例数减去其各自的'false cases'。

例如,当 1 < 年 < 2 时,我想要:案例 - 3

那么当 2 < 年 < 3 时,我想要:案例 - 4

当 3 < 年 < 4 时,我想要:案例 - 8

等等

这样一个新的专栏,说实际案例是:

 year     actual cases
 1.1         9            (12-3)
 1.2         11           (14-3)
 1.4         16           (19-3)
 1.6         20           (23-3)
 1.6         11           (14-3)
 2.1         22           (26-4)
 2.5         23           (27-4)
 2.7         31           (35-4)
 3.1         13           (21-8)
 3.3         16           (24-8)
 3.8         20           (28-8)

我尝试了一些类似

的方法
 for i in range(0,df[["year"]:
     if int(df[["year"][i]) > int(df[["year"][i+1]):
         df[["cases"][i] - f[i]

但这显然是错误的,我不知道该怎么办。

你可以这样做:

df['cases'] - (df['year']//1).astype(int).map({e:i for e, i in enumerate(f, 1)})

df['cases'] - pd.Series(f).reindex(df['year']//1-1).to_numpy()

像这样的东西应该可以工作:

def my_fun(df, year, factor):
    df['cases'][df['year'].astype(int) == year] = df['cases'][df['year'].astype(int) == year] - factor
    return df

我会这样做:

f = [3, 4, 8]

for i, row in df.iterrows():
    if 1<=row["year"]<2:
        df.at[i, "case"] = row["case"] - f[0]
    elif 2<=row["year"]<3:
        df.at[i, "case"] = row["case"] - f[1]
    else:
        df.at[i, "case"] = row["case"] - f[2]

原始数据框:

   year  case
0   1.0     8
1   1.1     5
2   1.2    17
3   1.3     1
4   1.4    12

结果:

   year  case
0   1.0     5
1   1.1     2
2   1.2    14
3   1.3    -2
4   1.4     9

或者您可以这样做:

df["year"] = df["year"].astype(int)
for i, j in enumerate(f, 1):
    df["case"] - j