如何对比DataFrame两列值并生成Is_dob列?
问题分析与解决方案
你的代码存在几个关键问题导致无法得到预期结果:
- 嵌套循环逻辑错误:两层循环会遍历所有
Age和diff(DOB-today)的组合,每次赋值都会覆盖整个Is_dob列,最终只会保留最后一次循环的结果,完全没有实现逐行对比的逻辑。 - 列名不匹配:示例数据中对比列是
diff(DOB-today),但你的代码里用了df['diff'],会导致无法正确获取目标列的数据。 - 大小写不一致:示例要求空值时赋值
Other,但代码里写的是'other',不符合输出要求。
正确实现方式
推荐使用Pandas的矢量化操作(避免循环,效率更高),以下是两种可行方案:
方案1:使用numpy.where链式判断(推荐)
import numpy as np import pandas as pd # 先判断是否存在空值,再对比两列值是否相等 df['Is_dob'] = np.where( # 检查Age或diff(DOB-today)是否有缺失值 df[['Age', 'diff(DOB-today)']].isnull().any(axis=1), 'Other', # 无空值时,判断两值是否相等 np.where(df['Age'] == df['diff(DOB-today)'], 'Yes', 'No') )
方案2:使用apply逐行处理(适合逻辑更复杂的场景)
def get_is_dob(row): age = row['Age'] diff_val = row['diff(DOB-today)'] if pd.isnull(age) or pd.isnull(diff_val): return 'Other' return 'Yes' if age == diff_val else 'No' df['Is_dob'] = df.apply(get_is_dob, axis=1)
验证示例数据
假设你的示例DataFrame定义如下:
df = pd.DataFrame({ 'Age': [54, 27, 43, 68, pd.NA], 'diff(DOB-today)': [54, 27, 44, 70, pd.NA] })
运行上述代码后,Is_dob列会得到预期结果:['Yes', 'Yes', 'No', 'No', 'Other']
内容的提问来源于stack exchange,提问作者Shital
相关产品推荐
相关产品推荐

