在嵌套的for循环中使用追加时如何解决索引丢失

时间:2019-02-15 01:11:13

标签: python pandas dataframe for-loop nested

我想从另一个数据框中的阈值(第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))

有更好的方法吗?

1 个答案:

答案 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