因此,我得到了一个Pandas海洋表面温度异常数据框架(“ssta”),每个月(“月”,1-12)都有唯一的第90和第10百分位值(“第90”、“第10”)。一个例子如下:
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
我需要在dataframe中创建一个新列(称为“阈值”),它将基于第90和第10个值。。。。如果ssta>=第90个,则新列应包含“+1”,如果它<=第10个,则应包含“-1”,如果介于两者之间,则应包含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
我让它处理另一个 Dataframe ,但我只处理一个月,因此很容易将所有“ssta”列值与相同的百分位值进行比较。现在有点复杂了,因为有多个月,所以有多个百分位值。不确定这是否会受益于for循环,或者某种类型的if语句(我对此很生疏)。如有任何见解,将不胜感激!
下面我将展示我的工作内容,但同样是基于一个月(6月)的情况:
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
暂无答案!
目前还没有任何答案,快来回答吧!