如何将DataFrame中AUTHOR列后的数值列大于0的值设为1?
解决DataFrame混合类型下仅对数值列将非0值转为1的问题
你的问题出在直接对整个混合类型的DataFrame做替换操作——AUTHOR列是字符串类型,其他日期列是数值类型,当你执行Counts[Counts != 0] = 1时,Python会尝试给字符串列(AUTHOR)也赋值数值1,这就触发了类型不匹配的错误。
要实现仅对日期列(数值列)进行转换,保留AUTHOR列不变,有以下几种可行方案:
方案1:指定目标列(按位置或列名)
如果明确知道日期列是AUTHOR之后的所有列,可以直接选中这些列进行转换:
# 获取AUTHOR之后的所有日期列 date_columns = Counts.columns[1:] # 使用numpy.where高效替换:大于0的值设为1,否则保留原数值 Counts[date_columns] = np.where(Counts[date_columns] > 0, 1, Counts[date_columns])
也可以用applymap实现相同逻辑:
Counts[date_columns] = Counts[date_columns].applymap(lambda x: 1 if x > 0 else x)
方案2:自动识别数值型列
如果不确定日期列的位置,或者DataFrame里还有其他数值列需要处理,可以用select_dtypes自动筛选数值类型的列:
# 筛选所有数值型列 numeric_columns = Counts.select_dtypes(include=['number']).columns # 先判断数值是否大于0(返回布尔值),再转为float类型(True→1.0,False→0.0) Counts[numeric_columns] = Counts[numeric_columns].gt(0).astype(float)
执行上述任意一种方案后,就能得到你想要的结果:
AUTHOR 2022-07-01 2022-10-14 2022-10-15 ..... 0 Kathrine 0.0 1.0 0.0 1 Catherine 0.0 1.0 1.0 2 Amanda Jane 0.0 0.0 0.0 3 Jaqueline 0.0 1.0 0.0 4 Christine 0.0 0.0 0.0
内容的提问来源于stack exchange,提问作者Raven
相关产品推荐
相关产品推荐

