我想从另一个数据框中的阈值(第5个百分点)以下的数据框中过滤出行
我尝试做一个嵌套的for循环并附加输出,但是索引丢失了 而且运行时间真的超过了两分钟
我有一个名为Fiveperc的数据框,其格式为(366,1):
tmin
1 11.32
2 11.0
3 11.41
4 11.885
5 12.155
....
366 13.08
和另一个名为df2的数据帧,格式为(18910,1)
date tmin
1966-01-01 13.9
1966-01-02 17.1
1966-01-03 17.1
1966-01-04 16.2
.....
2018-12-31 17
使用:
anomaly = []
for yearday,perc in fiveperc.iterrows():
for date,temp in df2.iterrows():
if yearday == date.dayofyear:
anomaly.append(temp - perc)
anomaly = pd.DataFrame(anomaly)
使用上面的第一段代码具有一个输出数据帧(18910,1):
index tmin
0 2.58
1 3.27
2 4.27
3 2.08
4 -3.52
....
18909 5.579
这里的问题是df2中的datetime索引丢失,导致排列不同! 而且此嵌套的for循环要花两分钟的时间。
如果我得到以上工作的代码,则为额外的代码:
anomaly[anomaly>0]=np.nan
anomaly[anomaly<0]= 1
anomaly.replace(0, np.nan, inplace=True)
Frequency = pd.DataFrame(final.groupby(lambda x: x.dayofyear)['anomaly'].agg(sum))
有更好的方法吗?
答案 0 :(得分:0)
您可以使用dt访问器在列上查找一年中的某天:
In [11]: df
Out[11]:
date tmin
0 1966-01-01 13.9
1 1966-01-02 17.1
2 1966-01-03 17.1
3 1966-01-04 16.2
In [12]: df1
Out[12]:
tmin
1 11.320
2 11.000
3 11.410
4 11.885
5 12.155
In [13]: df1.loc[df.date.dt.dayofyear, "tmin"]
Out[13]:
1 11.320
2 11.000
3 11.410
4 11.885
Name: tmin, dtype: float64
In [14]: df["tmin"] - df1.loc[df.date.dt.dayofyear, "tmin"].values
Out[14]:
0 2.580
1 6.100
2 5.690
3 4.315
Name: tmin, dtype: float64
您也可以使用groupby转换来执行此操作,但是我怀疑这会稍微慢一些:
In [21]: df.groupby(df.date.dt.dayofyear)["tmin"].transform(lambda x: x - df1.loc[x.name, "tmin"])
Out[21]:
0 2.580
1 6.100
2 5.690
3 4.315
Name: tmin, dtype: float64