【问题标题】:How to round pandas dataframe to fractions?如何将熊猫数据框舍入为分数?
【发布时间】:2016-05-20 15:49:58
【问题描述】:

给定

np.random.seed(1234)
df = pd.DataFrame({'A' : range(10), 'B' : np.random.randn(10), 'C' : np.random.randn(10)})

如何将 B、C 列四舍五入到最接近的 0.25。这是我尝试过的:

def roundPartial (value, resolution):
    return round (value / resolution) * resolution
df[['B', 'C']].apply(roundPartial, 0.25)

但我明白了:

ValueError: No axis named 0.25 for object type <class 'pandas.core.frame.DataFrame'>

【问题讨论】:

    标签: python python-2.7 pandas dataframe rounding


    【解决方案1】:

    如果你需要apply函数roundPartialarguments,你可以使用lambda

    def roundPartial (value, resolution):
        return round (value / resolution) * resolution
    print (df[['B', 'C']].apply(lambda x: roundPartial(x, 0.25)))
          B     C
    0  0.50  1.25
    1 -1.25  1.00
    2  1.50  1.00
    3 -0.25 -2.00
    4 -0.75 -0.25
    5  1.00  0.00
    6  0.75  0.50
    7 -0.75  0.25
    8  0.00  1.25
    9 -2.25 -1.50
    

    round 的另一个解决方案:

    print (df[['B', 'C']].apply(lambda x: (x / 0.25).round()* 0.25))
    
          B     C
    0  0.50  1.25
    1 -1.25  1.00
    2  1.50  1.00
    3 -0.25 -2.00
    4 -0.75 -0.25
    5  1.00  0.00
    6  0.75  0.50
    7 -0.75  0.25
    8  0.00  1.25
    9 -2.25 -1.50
    

    但是较大的DataFrame 中最快的不是使用apply,你可以除以div 所有DataFrame 除以resolution 和乘以mul

    resolution = 0.25
    print ((df[['B', 'C']].div(resolution)).round().mul(resolution))
    #print ((df[['B', 'C']] / resolution).round() * resolution)    
    
          B     C
    0  0.50  1.25
    1 -1.25  1.00
    2  1.50  1.00
    3 -0.25 -2.00
    4 -0.75 -0.25
    5  1.00  0.00
    6  0.75  0.50
    7 -0.75  0.25
    8  0.00  1.25
    9 -2.25 -1.50
    

    时间安排len(df)=100k

    df = pd.concat([df]*10000).reset_index(drop=True)
    
    In [125]: %timeit (df[['B', 'C']].apply(lambda x: (x / resolution).round()* resolution))
    10 loops, best of 3: 29 ms per loop
    
    In [126]: %timeit ((df[['B', 'C']] / resolution).round() * resolution)
    10 loops, best of 3: 22.5 ms per loop
    
    In [127]: %timeit ((df[['B', 'C']].div(resolution)).round().mul(resolution))
    10 loops, best of 3: 22.6 ms per loop
    

    【讨论】:

      猜你喜欢
      • 2017-05-09
      • 1970-01-01
      • 2021-06-24
      • 2020-03-24
      • 1970-01-01
      • 2018-02-28
      • 2020-02-13
      • 2019-05-29
      • 2021-05-10
      相关资源
      最近更新 更多