在Pandas中使用Lambda比较datetime64[ns]列未生效的问题
问题分析与解决
你的代码逻辑条件写反了,导致不符合需求的场景下也修改了Dt-1的值。
问题根源
你需求是:当Dt-1的datetime值大于Dt-2时,将Dt-1替换为Dt-2,但你的lambda表达式逻辑完全相反:
- 当前代码是:如果
Dt-1>Dt-2,保留Dt-1;否则替换为Dt-2 - 这和你要实现的需求刚好颠倒,所以才会出现不符合条件时
Dt-1被修改的情况。
修正后的代码
import pandas as pd df = pd.DataFrame([["a", "2022-11-01 00:01:11", "2022-11-02 00:02:33"] ], columns=["gr", "Dt-1", "Dt-2"]) df["Dt-1"] = pd.to_datetime(df["Dt-1"]) df["Dt-2"] = pd.to_datetime(df["Dt-2"]) print("修改前:") print(df) print(df.info()) # 修正逻辑:当Dt-1 > Dt-2时替换为Dt-2,否则保留原Dt-1 df["Dt-1"] = df.apply(lambda x: x["Dt-2"] if x["Dt-1"] > x["Dt-2"] else x["Dt-1"], axis=1) print("\n修改后:") print(df) print(df.info())
更高效的实现方式(推荐)
apply在大数据集上效率较低,推荐使用pandas原生向量化操作,性能更优:
方法1:使用np.where
import numpy as np df["Dt-1"] = np.where(df["Dt-1"] > df["Dt-2"], df["Dt-2"], df["Dt-1"])
方法2:使用df.loc
df.loc[df["Dt-1"] > df["Dt-2"], "Dt-1"] = df["Dt-2"]
内容的提问来源于stack exchange,提问作者Facimus
相关产品推荐
相关产品推荐

