根据数据框中的相应数字从数据框中减去数字
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
我有一个 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