首页 > 解决方案 > 比较多个行值并根据大于/小于分配一个数字

问题描述

所以我有一个海面温度异常('ssta')的大熊猫数据框,每个月('Month',1-12)都有第 90 和第 10 个百分位数('90th','10th')的唯一值. 下面是一个例子:

monlth_data

    lat     lon      time         Month  ssta       90th         10th
0   24.125  262.375  1982-01-01     1   -0.953852   1.566498    -1.620501
1   24.125  262.375  1982-01-02     1   -0.403852   1.566498    -1.620501
2   24.125  262.375  1982-01-03     1   -0.083853   1.566498    -1.620501
3   24.125  262.375  1982-01-04     1   -0.243853   1.566498    -1.620501
4   24.125  262.375  1982-01-05     1   -0.213852   1.566498    -1.620501
... ... ... ... ... ... ... ...
7798309 30.375  273.875 2020-12-27  12  -0.139111   1.382500    -1.377530

我需要在数据框中创建一个新列(称为“阈值”),该列将基于第 90 个和第 10 个值...。如果 ssta >= 第 90 个,此新列应包含“+1”,“ -1' 如果它 <= 第 10 个,或者 0 如果介于两者之间(既不是 -1/+1)。这是一个示例:

monthly_threshold

    lat     lon      time         Month  ssta       90th         10th       threshold
0   24.125  262.375  1982-01-01     1   0.000000    1.566498    -1.620501   0
1   24.125  262.375  1982-01-01     1   -2.00000    1.566498    -1.620501   -1 
2   24.125  262.375  1982-01-01     1   2.000000    1.566498    -1.620501   +1

我让它在另一个数据框上工作,但我只工作了一个月,所以很容易将所有“ssta”列值与相同的百分位值进行比较。现在它有点复杂,因为有多个月份,因此有多个百分位值。不确定这是否会受益于 for 循环或某种类型的 if 语句(我对此感到生疏)。任何见解将不胜感激!

下面我将展示我所做的工作,但同样是基于一个月(六月):

SSTA_df_copy['threshold'] = ''
SSTA_df_copy.loc[SSTA_df_copy.SSTA <= SSTA_df_copy.SSTA.quantile(.1), 'threshold'] = -1
SSTA_df_copy.loc[(SSTA_df_copy.SSTA > SSTA_df_copy.SSTA.quantile(.1)) & (SSTA_df_copy.SSTA < SSTA_df_copy.SSTA.quantile(.9)), 'threshold'] = 0
SSTA_df_copy.loc[SSTA_df_copy.SSTA >= SSTA_df_copy.SSTA.quantile(.9), 'threshold'] = 1


         lat    lon     time        day  SSTA       threshold   year
604607  28.625  274.625 2002-06-30  30  -1.463335   -1          2002
89967   28.625  267.375 2013-06-30  30   0.946152   0           2013

标签: pythonpandas

解决方案


推荐阅读