Python Pandas:两日期列非空时取较小值的实现问题
解决方案:仅当两列均非空时取日期最小值
我来帮你搞定这个需求!你遇到的问题核心是要严格过滤掉任一列为空的行,再计算剩余行的日期最小值,而默认的min(axis=1)会自动忽略空值取非空的那个,不符合你的要求。另外你碰到的AttributeError: 'list' object...错误,大概率是不小心把列名列表当成了DataFrame对象来调用方法导致的,我下面给你分步解决:
方法一:向量化筛选(推荐,效率更高)
先通过布尔掩码筛选出两列都不为空的行,再对这些行计算最小值,不符合条件的行自动保留NaN:
import pandas as pd # 假设你的DataFrame名为df,目标列是这两个 target_cols = ['Internal Review', 'Imported Date'] # 创建掩码:仅保留两列都非空的行 valid_rows_mask = df[target_cols].notna().all(axis=1) # 对有效行计算最小值,赋值到新列 df['Minimum Date'] = df.loc[valid_rows_mask, target_cols].min(axis=1)
这样处理后,有空值的行(比如你说的第1行和第4行)的Minimum Date会是NaN,只有两列都有日期的行才会得到较小值。
方法二:逐行判断(适合小数据集)
如果你的数据集不大,也可以用apply结合lambda函数逐行判断,逻辑更直观:
df['Minimum Date'] = df.apply( lambda row: min(row['Internal Review'], row['Imported Date']) # 仅当两列都非空时计算,否则返回空值 if pd.notna(row['Internal Review']) and pd.notna(row['Imported Date']) else pd.NA, axis=1 )
关于你遇到的AttributeError
这个错误几乎都是因为你误将列名的列表(比如['Internal Review', 'Imported Date'])当成了DataFrame对象来调用方法。比如如果写成min(target_cols)或者target_cols.min(axis=1),肯定会报错——因为Python的列表没有min(axis=1)这种方法。要确保你是对df[target_cols]这个DataFrame子集调用min()方法,而不是直接操作列名列表。
内容的提问来源于stack exchange,提问作者MethJordan
相关产品推荐
相关产品推荐

