如何在Pandas中按行而非按列对小数进行取整?
实现Pandas按行自定义小数取整
刚好碰到过类似的需求!pandas自带的round()确实默认是按列统一设置小数位数,但要实现逐行自定义取整规则其实很简单,这里给你两种实用的方法,完美匹配你的需求:
先还原你的数据场景
首先我们先构造你给出的原始数据(单列DataFrame):
import pandas as pd df = pd.DataFrame( {'A': [1010.00009, 54.45678, 0.50483]}, index=['count', 'measure', 'average'] )
原始输出:
A count 1010.00009 measure 54.45678 average 0.50483
方法1:用apply逐行匹配规则(直观易懂)
先定义好每行对应的小数取整规则,然后用apply遍历每一行,根据行索引匹配对应的规则:
# 定义每行的取整规则:键是行索引,值是保留的小数位数 round_rules = { 'count': 0, # 取整为整数 'measure': 2, # 保留2位小数 'average': 4 # 保留4位小数 } # 应用规则到A列 df['A'] = df.apply(lambda row: row['A'].round(round_rules[row.name]), axis=1) # 如果想把count行转成纯整数类型(不是带.0的浮点数),可以再加一步 df.loc['count', 'A'] = df.loc['count', 'A'].astype(int)
方法2:用index.map关联规则(更高效简洁)
因为是单列数据,我们可以直接利用Series.round()支持传入对应位数序列的特性,通过索引映射规则来实现:
round_rules = { 'count': 0, 'measure': 2, 'average': 4 } # 用索引映射得到每行的取整位数,直接传入round() df['A'] = df['A'].round(df.index.map(round_rules)) # 同样可选:把count行转成整数 df.loc['count', 'A'] = df.loc['count', 'A'].astype(int)
最终输出结果
两种方法都会得到你想要的格式:
A count 1010 measure 54.46 average 0.5048
扩展说明
如果是多列的DataFrame需要按行设置不同的取整规则,你可以构造一个和原DataFrame形状完全一致的"位数矩阵",然后传入df.round()方法即可,原理是一样的。
内容的提问来源于stack exchange,提问作者eternity1
相关产品推荐
相关产品推荐

