如何将DataFrame字符串值转为布尔值?列数不匹配错误求解
问题解决:将YES/NO/NaN列转换为布尔值并重构DataFrame
错误原因
你当前的death_data是包含5个一维ndarray的列表,每个ndarray对应原DataFrame中一列的布尔值结果(长度为159,即原数据的行数)。当你直接执行pd.DataFrame(death_data, columns=death_columns)时,pandas会将列表里的每个ndarray当作一行数据,最终生成一个5行、159列的DataFrame,但你指定了仅5列,因此出现列数不匹配的报错。
解决方案
方案1:转置数据后创建DataFrame
将death_data转置,把原本的列数据转换为行数据,与指定列名匹配:
import pandas as pd import numpy as np death_columns = ['Death1', 'Death2', 'Death3', 'Death4', 'Death5'] death_counts = combined_dataframe[death_columns] death_data = [np.where(death_counts[c] == "YES", True, False) for c in death_columns] # 转置数组,让列数据变为行数据 death_counts = pd.DataFrame(np.array(death_data).T, columns=death_columns)
方案2:用pandas内置方法简化操作
无需借助numpy的where,直接利用pandas的Series比较操作,代码更简洁高效:
# 直接将"YES"转为True,"NO"和NaN转为False death_counts = combined_dataframe[death_columns].eq("YES")
如果需要单独处理NaN(比如将NaN转为特定布尔值),可先填充缺失值:
# 先把NaN替换为"NO",再转为布尔值 death_counts = combined_dataframe[death_columns].fillna("NO").eq("YES")
内容的提问来源于stack exchange,提问作者Mark Molina
相关产品推荐
相关产品推荐

