You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何让pandas DataFrame存储True/False而非1/0?

问题原因与解决方案

根因分析

  • 旧版本pandas的默认bool类型不支持空值,当你初始化空DataFrame再逐行追加时,pandas的类型推断逻辑会因为初始无数据出现偏差,将布尔值向上转型为支持空值的float64,最终存储为1.0/0.0。
  • 原始代码存在语法问题:普通Python列表不支持abs()向量化运算,循环逻辑也未对应三个列表的位置索引,直接运行会报错。

最优解决方案

推荐放弃已被pandas 2.0+废弃的append方法,先把所有行数据存储到Python列表中,最后一次性生成DataFrame,可自动保留布尔类型:

import pandas as pd

def new_row(item1, item2):
    new_row = {
        'lister': item1,
        'metric': item2
    }
    return new_row

lister = ['a', 'b', 'c']
position = [1.1, 2.3, 4.5]
evaluation_metric = [0, 0.5, 0.2]

rows = []
# 按位置匹配三个列表的对应元素
for item1, pos, threshold in zip(lister, position, evaluation_metric):
    compare_res = abs(pos) > threshold
    print(compare_res)
    nr = new_row(item1, compare_res)
    rows.append(nr)

# 批量生成DataFrame,自动保留bool类型
final_df = pd.DataFrame(rows)

如果是做批量向量化比较,完全可以省去循环,写法更简洁性能更高:

import pandas as pd
import numpy as np

lister = ['a', 'b', 'c']
position = np.array([1.1, 2.3, 4.5])
evaluation_metric = np.array([0, 0.5, 0.2])

final_df = pd.DataFrame({
    'lister': lister,
    'metric': np.abs(position) > evaluation_metric
})

可选方案(必须逐行追加时)

如果你必须使用逐行追加的逻辑,可以在初始化空DataFrame时提前指定列的类型,避免类型自动转换:

import pandas as pd

# 初始化时指定列名和对应数据类型
final_df = pd.DataFrame({
    'lister': pd.Series(dtype='object'),
    'metric': pd.Series(dtype='bool') # 用pd.BooleanDtype()也可,支持空值
})

内容的提问来源于stack exchange,提问作者silvercoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 19:54:03