python - 带有两个数据框的 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
解决方案
一种使用pandas.to_datetime
with 的方法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
推荐阅读
- excel - 为行创建键/唯一值
- hyperledger-fabric - 将现有的 Hyperledger Fabric 排序器从单独升级到基于 Kafka
- angular - 没有装饰器的组件的角度依赖注入
- sql - SQL - 想要为每个 IF 条件写入唯一的错误值
- oozie - oozie 4.2.0 版本中的重试最大值
- file - 接受“作为 .BAT 文件中用户的输入?
- java - 从JDK1.8升级到JDK1.11时如何解决“无法解析导入javax.xml.namespace.QName”
- c# - 如何在 IEnumarable 中编写多个 IF 条件
- fabricjs - fabricJS - 获取对象类
- wcf-client - 如何从 WCF 客户端获取 Soap Envelope 响应