如何将DataFrame列.describe()结果写入新DataFrame并按列分组?
解决分组后describe结果格式化的TypeError问题
你遇到的问题核心在于:groupby('SITE')['DSKPERCENT'].describe()返回的是一个层次化索引的DataFrame,每一行对应一个SITE的所有统计指标(count、mean、std等)。你原来用的apply(lambda x: format(x, 'f'))默认是按列(axis=0)处理,此时x是一个包含所有SITE对应统计项的Series,而format()函数只能处理单个数值,自然会抛出TypeError。
下面给你两种常见需求的解决方案:
方案1:将每个分组的统计信息合并为单个字符串列
如果你想把每个SITE的所有统计结果打包成一个字符串,放到名为SITE_DESCRIBE的列中,可以这样写:
import pandas as pd # 假设你的源DataFrame名为df df5 = df.groupby('SITE')['DSKPERCENT'].describe().apply( lambda row: ', '.join([f'{stat}: {value:.2f}' for stat, value in row.items()]), axis=1 # 指定按行处理,axis=1代表每一行对应一个SITE的统计结果 ).reset_index(name='SITE_DESCRIBE')
这段代码会把每个SITE的统计项(比如count、mean)和对应数值格式化为统计项: 数值的格式,再用逗号拼接成字符串,最终得到包含SITE和SITE_DESCRIBE两列的DataFrame。
方案2:保留所有统计列,格式化数值
如果你希望保留count、mean、std等独立列,只是把数值格式化为普通浮点数(避免科学计数法),可以使用applymap对每个元素单独处理:
# 获取分组统计结果 descr_result = df.groupby('SITE')['DSKPERCENT'].describe() # 对每个数值元素格式化(这里保留2位小数,可根据需求调整) formatted_result = descr_result.applymap(lambda x: f'{x:.2f}') # 重置索引得到最终DataFrame df5 = formatted_result.reset_index()
如果不需要把数值转成字符串,只是想在显示时用浮点数格式,可以设置Pandas的显示选项:
pd.options.display.float_format = '{:.2f}'.format # 之后直接查看descr_result就会以指定格式显示
为什么原来的代码报错?
你原来的代码中,apply默认是按列(axis=0)执行,此时lambda x中的x是一列数据(比如所有SITE的count值组成的Series),而format(x, 'f')试图把整个Series当作单个数值来格式化,这显然不符合format函数的参数要求,所以触发了TypeError。
内容的提问来源于stack exchange,提问作者odonnry
相关产品推荐
相关产品推荐

