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
相关产品推荐
相关产品推荐

