Pandas中按比较条件从另一DataFrame追加列填充值的实现问题
问题原因
现有循环仅遍历了df2的前3组相邻时间区间[0,1)、[1,2)、[2,3),未覆盖Time≥3的区间,因此这部分行的Value值保留初始的NaN。
解决方案
方案1:修改原有循环逻辑
在原有循环结束后补充对最后一个区间的赋值即可:
import pandas as pd import numpy as np df=pd.DataFrame(np.arange(0, 5, 0.3), columns=['Time']) df2 = pd.DataFrame({'Time': [0, 1, 2, 3], 'Value': [6, 8, 9, 6]}) df["Value"] = np.nan for t1, t2, v in zip(df2["Time"].values[:-1], df2["Time"].values[1:], df2["Value"].values[:-1]): df.loc[(df["Time"] >= t1) & (df["Time"] < t2), "Value"] = v # 补充赋值Time≥3的行 df.loc[df["Time"] >= df2["Time"].iloc[-1], "Value"] = df2["Value"].iloc[-1] print(df)
方案2:使用pandas内置merge_asof实现(更高效,无需循环)
merge_asof可以自动匹配左表Time对应的右表中最近的小于等于的Time值,完全匹配需求,适合处理数据量较大的场景:
import pandas as pd import numpy as np df=pd.DataFrame(np.arange(0, 5, 0.3), columns=['Time']) df2 = pd.DataFrame({'Time': [0, 1, 2, 3], 'Value': [6, 8, 9, 6]}) # merge_asof要求参与匹配的列均为升序排列,提前排序保证兼容性 df = df.sort_values("Time") df2 = df2.sort_values("Time") df = pd.merge_asof(df, df2, on="Time") print(df)
两种方案运行后均会得到预期输出结果。
内容的提问来源于stack exchange,提问作者Tomasz
相关产品推荐
相关产品推荐

