DataFrame单元格小数截断失败,求各国行均值计算解决方案
嘿,我来帮你搞定这两个问题,一步步拆解:
问题1:截断DataFrame所有单元格的小数
先明确需求:你是想修改数据本身让小数截断,还是只是在显示时隐藏过长小数但保留原数据精度?两种场景的处理方式不同:
方式1:修改数据本身(截断到指定小数位)
假设你想把所有数值截断到2位小数(比如把1567.8912变成1567.89),可以用math.trunc结合applymap遍历所有单元格:
import pandas as pd import math # 假设你的DataFrame名为gdp_df gdp_df = gdp_df.applymap(lambda x: math.trunc(x * 100) / 100)
如果要直接截断为整数(去掉所有小数部分),更简单:
gdp_df = gdp_df.applymap(math.trunc) # 因为GDP都是正数,用astype(int)效果也一样 gdp_df = gdp_df.astype(int)
方式2:仅调整显示格式(不修改原数据)
如果只是不想看到冗长的小数,但不想改动原始数据,可以设置pandas的显示规则:
pd.set_option('display.float_format', lambda x: '{:.2f}'.format(math.trunc(x*100)/100))
这样打印DataFrame时会显示截断后的小数,但数据本身的精度完全保留。
问题2:计算每个国家所有行的均值
先理清你的DataFrame结构:国家是索引,那每个国家是对应一行多列(比如列是不同年份的GDP),还是多行多列(比如每行是该国家不同行业的GDP)?两种情况的处理如下:
情况A:每个国家对应一行(列是不同维度的GDP)
要计算每个国家(每行)的所有列均值,直接用pandas的mean方法指定axis=1即可:
# 结果是一个Series,索引为国家,值为对应均值 country_gdp_mean = gdp_df.mean(axis=1)
如果你一定要用np.average,注意要按行计算,且如果数据有缺失值,np.average不会自动忽略,建议改用np.nanmean:
import numpy as np country_gdp_mean = gdp_df.apply(lambda row: np.nanmean(row), axis=1)
情况B:每个国家对应多行(同个国家有多条记录)
这种情况需要先按国家索引分组,再计算每组的均值:
# 按索引(国家)分组,计算每组的均值 country_gdp_mean = gdp_df.groupby(gdp_df.index).mean()
用np.average的话,需要在分组后应用:
country_gdp_mean = gdp_df.groupby(gdp_df.index).apply(lambda group: np.nanmean(group))
你用np.average出问题,大概率是直接调用了np.average(gdp_df)——这会把整个DataFrame扁平化,计算的是全局均值,而非按国家分组的均值。
内容的提问来源于stack exchange,提问作者Nakul Sharma
相关产品推荐
相关产品推荐

