如何将DataFrame列的NaN值替换为0、其余值替换为1?求助
解决DataFrame列替换NaN为0、其余值为1的问题
嘿,我来帮你搞定这个问题!你之前的lambda函数出问题是因为它在检查整个列的非0值,而不是逐个判断每个元素是不是NaN,所以才会整列都变成1。下面给你几种简单高效的正确解法:
方法1:用notna() + astype(int)(最简洁高效)
这是最推荐的方法,notna()会直接标记非NaN值为True,NaN值为False,转成整数后True对应1,False对应0,完全符合你的需求:
import pandas as pd # 假设你的DataFrame叫df,目标列是'Column' df['Column'] = df['Column'].notna().astype(int)
方法2:用apply配合正确的lambda函数
如果想用lambda实现,要针对每个元素x单独判断是否为NaN,而不是对整个列做全局判断:
df['Column'] = df['Column'].apply(lambda x: 1 if pd.notna(x) else 0)
这里pd.notna(x)是专门用来判断元素是否非NaN的方法,比利用“NaN不等于自身”的特性(x == x)更直观易懂。
方法3:用replace配合映射逻辑
也可以通过两次替换完成:先把NaN换成0,再把所有非0值统一换成1:
df['Column'] = df['Column'].replace({pd.NA: 0}) df['Column'] = df['Column'].apply(lambda x: 1 if x != 0 else 0)
不过这种方法需要两步操作,不如前两种简洁高效。
为什么你的原lambda失效?
你写的lambda x: 1 if any(dataframe['Colum'].values != 0) else 0里,any(dataframe['Colum'].values != 0)是对整个列做判断:只要列里存在一个非0的元素(你的列里有字符串、数字这些非NaN值,都会被判定为True),any()就返回True,所以每个元素都会被替换成1,这就是问题的核心。
内容的提问来源于stack exchange,提问作者Imran Ahmad Ghazali
相关产品推荐
相关产品推荐

