Pandas DataFrame使用replace方法转换值时出现NaN问题的排查与解决
问题拆解与解决办法
嘿,我来帮你搞定这个全NaN的问题!你的操作里有两个关键错误,咱们一个个说:
1. 操作顺序搞反了:别先转数值型再替换
你提到“先把列转成数值型,再用replace”——这就是核心坑!Hand Type列原本是字符串('right'/'left'),强行转数值型的话,pandas根本没法把字符串解析成数字,直接就把所有值变成NaN了。之后再用replace找'right'/'left',当然啥也匹配不到,结果全是NaN。
2. replace默认不修改原数据
pandas的replace()方法默认是返回一个新的结果,不会直接修改你的原DataFrame。如果你只是跑了right_hand[' Hand Type'].replace(...)但没把结果存回去,原列根本不会变;要是在已经变成NaN的列上跑,那结果肯定还是NaN。
正确的操作步骤
方法一:直接对原字符串列替换并赋值
跳过“转数值型”的错误步骤,直接对原始字符串列做替换,然后把结果赋值回原列(或者新建一列也行):
# 替换后覆盖原列 right_hand[' Hand Type'] = right_hand[' Hand Type'].replace({'right': 1, 'left': 0}) # 或者保留原列,新建一个数值列 right_hand['Hand_Type_Num'] = right_hand[' Hand Type'].replace({'right': 1, 'left': 0})
执行后你的DataFrame就会变成:
Time Frame ID Hand Type # hands 0 343.0061 129364 1 2 1 343.0392 129367 0 2 2 343.0889 129373 1 2 3 343.1220 129377 0 2 4 343.1720 129383 1 2
方法二:用map更简洁
如果只有两种映射关系,map()用起来更直观:
right_hand[' Hand Type'] = right_hand[' Hand Type'].map({'right':1, 'left':0})
额外排查:有没有隐藏空格?
要是按上面的方法还是出NaN,那可能是原始字符串里藏着空格(比如' right'或者'right '),先清理一下:
# 先去掉字符串前后的空格 right_hand[' Hand Type'] = right_hand[' Hand Type'].str.strip() # 再替换 right_hand[' Hand Type'] = right_hand[' Hand Type'].replace({'right':1, 'left':0})
内容的提问来源于stack exchange,提问作者ItamarKraitman
相关产品推荐
相关产品推荐

