首页 > 解决方案 > 带有两个数据框的 Pandas 矢量化

问题描述

假设我有以下两个数据框。数据帧 A 和数据帧 B。

DataFrame A 有四列。年、月、日和温度。(例如 2021 || 7 || 5 || 23)。目前,DataFrame A 中的一些温度单元是 NaN。

DataFrame B 有两列。日期和温度。(例如 2021/7/7 || 28)

DataFrame A 和 DataFrame B 的时间间隔不同。DataFrame A 的时间间隔小于间隔 B。但它们中的一些重叠。(例如,DataFrame B 中每 10 分钟一次,DataFrame A 中每 5 分钟一次)。

现在,如果 DataFrame A 中有 NaN 值,我想将温度数据从 DataFrame B 复制到 DataFrame A。

我有一个使用循环的方法,但它很慢。我想使用熊猫矢量化。但我不知道怎么做。谁能教我?

    for i in tqdm(range(len(dfA['Temp']))):
       if(pd.isna(df['Temp'].iloc[i])):
         date_time_str = str(year) + '/' + str(month) + '/' + str(day)
         try:
            dfA['temp'].iloc[i] = float(dfB.loc[dfB['Date'] == date_time_str].iloc[:, 1])
            
         except:
            print("no value")
            pass

我的解决方案很慢,如何使用熊猫矢量化来做到这一点?

我尝试进行矢量化的方法:

dfA.loc[df['temp'].isnull() & ((datetime.datetime(dfA['Year'], df['*Month'], dfA['Day']).strftime("%Y/%m/%d %H:%M"))in dfB.Date.values) , 'temp'] = float(dfB[dfB['Date'] == datetime.datetime(dfA['Year'], df['*Month'], dfA['Day']].iloc[:, 1])

以上是我的方法和尝试,它不起作用。

示例数据:

DataFrame A
Year    Month   Day Temperature
2020    1        17  25
2020    1        18  NaN
2020    1        19  28
2020    1        20  NaN
2020    1        21  NaN
2020    1        22  NaN

DataFrame B
Date    Temp
1/17/2020   25
1/19/2020   28
1/21/2020   31
1/23/2020   34
1/25/2020   23
1/27/2020   54

Expected Output
Year    Month   Day Temperature
2020    1        17 25
2020    1        18 NaN
2020    1        19 28
2020    1        20 NaN
2020    1        21 31
2020    1        22 NaN




在此处输入图像描述

标签: pythonpandasnumpyvectorization

解决方案


一种使用pandas.to_datetimewith 的方法pandas.Series.fillna

df1 = df1.set_index(pd.to_datetime(df1[["Year", "Month", "Day"]]))
s = df2.set_index(pd.to_datetime(df2.pop("Date"))).squeeze()
df1["Temperature"] = df1["Temperature"].fillna(s)
print(df1.reset_index(drop=True))

输出:

   Year  Month  Day  Temperature
0  2020      1   17         25.0
1  2020      1   18          NaN
2  2020      1   19         28.0
3  2020      1   20          NaN
4  2020      1   21         31.0
5  2020      1   22          NaN

推荐阅读