求助:基于条件用np.where在Pandas DataFrame创建新列遇问题
解决创建二进制标记列的问题
嘿,我来帮你搞定这个二进制标记列的麻烦!你遇到的df.where和np.where报错问题,大多是因为对函数参数的用法理解有点偏差,我给你拆解清楚,再给你几个靠谱的实现方法:
先搞懂你遇到的错误原因
- ValueError(inplace参数类型错误):你之前可能把
1误传成了inplace参数的值——df.where的inplace参数只能是True或False,不能是整数,这才触发了类型报错。 - TypeError(混合类型原地设置错误):当你改成
True后,应该是尝试原地修改原列(比如disp_rating),但原列的类型和你要赋值的布尔值/整数类型不兼容(比如原列是字符串+数值的混合类型),而且inplace=True的原地修改对混合类型列的布尔设置支持很差,所以才会报错。
正确实现方法:优先用这几种
方法1:最简洁的布尔转整数法
其实根本不需要用到where系列函数,直接把布尔条件转成整数就好——Pandas会自动把True转成1,False转成0:
# 假设你的条件是disp_rating大于某个阈值,比如3 df['标记列'] = (df['disp_rating'] > 3).astype(int) # 如果想要布尔值列,直接用条件表达式就行: df['布尔标记列'] = df['disp_rating'] > 3
方法2:用np.where(逻辑最直观)
np.where的语法是np.where(条件, 满足条件时的值, 不满足条件时的值),非常适合创建这种二值列:
import numpy as np # 创建整数标记列 df['标记列'] = np.where(df['disp_rating'] > 3, 1, 0) # 创建布尔标记列 df['布尔标记列'] = np.where(df['disp_rating'] > 3, True, False)
方法3:正确使用df.where(适合复杂场景)
df.where的逻辑是满足条件时保留原数据,不满足时替换为指定值,所以如果要用它来创建标记列,得换个思路(不要原地修改原列,而是新建列):
# 先把新列全设为1,再把不满足条件的行替换成0 df['标记列'] = 1 df['标记列'] = df['标记列'].where(df['disp_rating'] > 3, 0) # 或者反过来,先设为0,满足条件的替换成1 df['标记列'] = 0 df['标记列'] = df['标记列'].where(df['disp_rating'] <= 3, 1)
记住:不要用inplace=True来修改原列,尤其是原列是混合类型的时候,新建一列完全可以避开类型冲突的问题。
内容的提问来源于stack exchange,提问作者LMGagne
相关产品推荐
相关产品推荐

