簡體   English   中英

在有正數和負數的 dataframe 中,如何將正數向上舍入和將負數向下舍入(均為 5 的倍數)?

[英]In a dataframe with both positive & negative numbers, how to round positive numbers up and round negative numbers down (both to multiples of 5)?

對於 dataframe 這樣的:

data={'A1':[-7.22,-9.432,-0.00111,0.233,17,23,34],
      'A2':[-23,-7.2455,-0.00222,0.54,1.345,19,21]}
kk=pd.DataFrame(data)
         A1        A2
0  -7.22000 -23.00000
1  -9.43200  -7.24550
2  -0.00111  -0.00222
3   0.23300   0.54000
4  17.00000   1.34500
5  23.00000  19.00000
6  34.00000  21.00000

我想向上舍入正數但向下舍入負數(5 的倍數),例如:

  • 21 將變成 25 而不是 20
  • -7 將變為 -10 而不是 -5

嘗試使用此方法僅收到錯誤

def roundupdown5(x):
   if x>=0:
       return np.ceil(x/5)*5
   else:
       return np.floor(x/5)*5

kk[['A1','A2']].apply(lambda x: roundupdown5(x))

謝謝:)

您可以使用applymap()而不是apply()

kk.applymap(roundupdown5)

結果是

      A1    A2
0   -10.0   -25.0
1   -10.0   -10.0
2   -5.0    -5.0
3   5.0 5.0
4   20.0    5.0
5   25.0    20.0
6   35.0    25.0

在構建DataFrame之前,您可以使用字典和列表理解將roundupdown5() function 應用於data的所有值:

import pandas as pd
import numpy as np

data={'A1':[-7.22,-9.432,-0.00111,0.233,17,23,34],'A2':[-23,-7.2455,-0.00222,0.54,1.345,19,21]}
kk=pd.DataFrame(data)


def roundupdown5(x):
    if x>=0:
        return np.ceil(x/5)*5
    else:
        return np.floor(x/5)*5

data = {k:[roundupdown5(i) for i in v] for k, v in data.items()}
kk=pd.DataFrame(data)
print(data, kk)

Output:

{'A1': [-10.0, -10.0, -5.0, 5.0, 20.0, 25.0, 35.0], 'A2': [-25.0, -10.0, -5.0, 5.0, 5.0, 20.0, 25.0]}      A1    A2
0 -10.0 -25.0
1 -10.0 -10.0
2  -5.0  -5.0
3   5.0   5.0
4  20.0   5.0
5  25.0  20.0
6  35.0  25.0

您可以在絕對值上使用numpy.ceil並使用numpy.sign帶回符號,然后您將受益於矢量速度:

np.ceil(abs(kk)/5)*5*np.sign(kk)

output:

     A1    A2
0 -10.0 -25.0
1 -10.0 -10.0
2  -5.0  -5.0
3   5.0   5.0
4  20.0   5.0
5  25.0  20.0
6  35.0  25.0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM