在Colab中处理DataFrame:保留两位小数并设置百分比格式
问题分析与修正方案
你的代码主要存在三个问题:
- 变量未定义:代码中
percentage是未声明的变量,实际应该引用value_percentage中的数值列 - DataFrame操作错误:
value_counts(normalize=True)返回的是DataFrame,不能直接用*100批量运算,需要指定目标列 - 列名混乱:直接拼接会导致列名重复,后续导出Excel后可读性差
修正后的代码(导出带百分比字符串的结果)
import pandas as pd # 假设你的原始DataFrame为df li = [] for col in df.columns: # 计算类别频数 value_counts = df[col].value_counts().to_frame().reset_index() # 重命名列,明确含义 value_counts.columns = [f'{col}_类别', f'{col}_频数'] # 计算百分比(normalize=True返回0-1的小数) value_percentage = df[col].value_counts(normalize=True).to_frame().reset_index() value_percentage.columns = [f'{col}_类别', f'{col}_百分比'] # 转换为保留两位小数的百分比字符串 value_percentage[f'{col}_百分比'] = value_percentage[f'{col}_百分比'].apply(lambda x: f'{x*100:.2f}%') # 合并同一列的频数和百分比,避免类别错位 combined_col = pd.merge(value_counts, value_percentage, on=f'{col}_类别') li.append(combined_col) # 按列拼接所有统计结果 data = pd.concat(li, axis=1) # 导出到Excel data.to_excel('类别统计结果.xlsx', index=False)
进阶方案:导出可计算的Excel百分比格式
如果希望Excel中的百分比是可参与运算的数值格式(而非字符串),可以用以下方式:
import pandas as pd from openpyxl.styles import numbers li = [] for col in df.columns: value_counts = df[col].value_counts().to_frame().reset_index() value_counts.columns = [f'{col}_类别', f'{col}_频数'] value_percentage = df[col].value_counts(normalize=True).to_frame().reset_index() value_percentage.columns = [f'{col}_类别', f'{col}_百分比'] # 保留4位小数(对应百分比的两位小数) value_percentage[f'{col}_百分比'] = value_percentage[f'{col}_百分比'].round(4) combined_col = pd.merge(value_counts, value_percentage, on=f'{col}_类别') li.append(combined_col) data = pd.concat(li, axis=1) # 导出时设置Excel单元格为百分比格式 with pd.ExcelWriter('可计算统计结果.xlsx', engine='openpyxl') as writer: data.to_excel(writer, index=False, sheet_name='统计数据') worksheet = writer.sheets['统计数据'] # 遍历所有百分比列,设置格式 for col_idx, col_name in enumerate(data.columns): if '百分比' in col_name: # Excel列号从1开始,chr(65+col_idx)对应A、B、C... worksheet.column_dimensions[chr(65 + col_idx)].number_format = '0.00%'
内容的提问来源于stack exchange,提问作者user16239103
相关产品推荐
相关产品推荐

