如何基于df2对应列小数位数批量对df1各列取整?
批量按对应列小数位数取整DataFrame
问题描述
现有两个列名一一对应的DataFrame:df1和df2,需要将df1的每一列按照df2对应列的小数位数进行取整。目前逐列手动调用round方法效率低下(两表均含40+列),需要批量处理方案。
示例数据
df1:
| Li | Be | Sc | V | Cr | Mn |
|---|---|---|---|---|---|
| 20.1564 | -0.0011 | -0.1921 | 0.0343 | 0.5729 | 0.1121 |
| 19.2871 | -0.0027 | 0.0076 | 0.066 | 0.5196 | 0.0981 |
| 0.8693 | 0.0016 | 0.1997 | 0.0317 | 0.0533 | 0.014 |
df2:
| Li | Be | Sc | V | Cr | Mn |
|---|---|---|---|---|---|
| 2.0 | 0.050 | 0.3 | 0.111 | 0.50 | 0.40 |
期望输出:
| Li | Be | Sc | V | Cr | Mn |
|---|---|---|---|---|---|
| 20.2 | -0.001 | -0.2 | 0.034 | 0.57 | 0.11 |
| 19.3 | -0.003 | 0 | 0.066 | 0.52 | 0.1 |
| 0.9 | 0.002 | 0.2 | 0.032 | 0.05 | 0.01 |
解决方案
步骤1:提取各列需保留的小数位数
从df2的唯一行中,计算每个值对应的小数位数:
# 提取df2第一行数据,计算每列的小数位数 decimal_places = df2.iloc[0].apply(lambda x: len(str(x).split('.')[1]))
运行后decimal_places结果为:
Li 1 Be 3 Sc 1 V 3 Cr 2 Mn 2 dtype: int64
步骤2:批量对df1执行取整操作
直接调用pandas.DataFrame.round()方法,传入上述小数位数的Series即可完成批量处理:
df_rounded = df1.round(decimal_places)
验证结果
运行上述代码后,df_rounded将完全匹配期望输出。
补充说明
- 若
df2存在多行数据,可根据实际需求先聚合(如取第一行、均值对应的小数位数等)后再执行上述步骤; - 该方法利用
pandas的向量化操作,比逐列循环效率高得多,适合处理大量列的场景。
内容的提问来源于stack exchange,提问作者Gingerhaze
相关产品推荐
相关产品推荐

