簡體   English   中英

如何在點后僅打印一個字符?

[英]How to print only one character after a dot?

我有一個具有不同值的數據框。 值是數字,但有時它們可​​以是字符串。 我只想在小數點后顯示一位小數。

我嘗試過轉換為字符串,但是我不知道如何在點后取一個字符。

這是我的數據框(減少):

0   18.932202   19.063694   19.822535   22.3385
1   19.215377   19.424890   20.249221   22.3116
2   19.096696   19.361342   20.011814   21.2492
3   18.914138   19.016130   >30.0       22.3597
4   18.896591   19.051426   19.647521   20.982

帶“>”的數字是一個字符串,這就是為什么我將所有內容都轉換為字符串的原因。

預期的數據幀:

0   18.9    19.0    19.8    22.3
1   19.2    19.4    20.2    22.3
2   19.0    19.3    20.0    21.2
3   18.9    19.0    >30.0   22.3
4   18.8    19.0    19.6    20.9

使用astype()round()

這是幾種類型的樣品

data = [[18.932202,19.063694,'19.822535',22.3385],
        [19.215377,19.424890 ,'20.249221',22.3116],
        [19.096696,19.361342,'20.011814',21.2492],
        [18.914138,'19.016130',9.734784 ,22.3597],
        [18.896591,19.051426,19.647521 ,20.982]]

df = pd.DataFrame(data, columns=['c1', 'c2', 'c3', 'c4'])
df.dtypes

輸出:

c1    float64
c2     object
c3     object
c4    float64
dtype: object

首先,您需要在float64( astype()的數字類型astype()上使用astype()轉換數據astype()

df = df.astype('float64')
df.dtypes

輸出:

c1    float64
c2    float64
c3    float64
c4    float64
dtype: object

然后使用round()減少點后的數字

df = df.round(1)
df

產量

    c1      c2      c3      c4
0   18.9    19.1    19.8    22.3
1   19.2    19.4    20.2    22.3
2   19.1    19.4    20.0    21.2
3   18.9    19.0    9.7     22.4
4   18.9    19.1    19.6    21.0

使用正則表達式?

這是一個可以解決問題的方法-我假設您要整個字符串,然后要在遇到點后一位:

.*\d+\.\d

希望能幫助到你!

編輯:您可以執行以下操作

df
       0          1          2        3
0  18.932202  19.063694  19.822535  22.3385
1  19.215377  19.424890  20.249221  22.3116
2  19.096696  19.361342  20.011814  21.2492

import re
pattern = re.compile('.*\d+\.\d')
df.applymap(lambda x: pattern.match(str(x)).group(0))

      0     1     2     3
0  18.9  19.0  19.8  22.3
1  19.2  19.4  20.2  22.3
2  19.0  19.3  20.0  21.2

也許你可以使用applymap

df1 = df.applymap(lambda x:x[0:4])

例如

df = pd.DataFrame({'a':['>1.1111','<1.1222'],'b':['>1.23333','18.1111']})

        a         b
0  >1.1111  >1.23333
1  <1.1222   18.1111

df1 = df.applymap(lambda x:x[0:4])

      a     b
0  >1.1  >1.2
1  <1.1  18.1

這是你想要的?:

def myprecision(input):
    ret = ""
    mysize = len(input)
    j=-1
    for i in range(0,mysize):
        if input[i] == '.':
            j = i+1
            break
    ret = input[:j+1]
    return ret


a = ">3.14159"
b = myprecision(a)
print(b)    
# output is = >3.1

四舍五入

values = ["19.063694", ">9.734784"]
newValues = []

for value in values:
    if value.startswith('>'):
        newValues.append(">%.1f" % float(value.lstrip('>')))
    else:
        newValues.append("%.1f" % float(value))

print(newValues) # ['19.1', '>9.7']

不取整

def truncate(f, n): # https://stackoverflow.com/a/783927/3209393
    '''Truncates/pads a float f to n decimal places without rounding'''
    s = '%.12f' % f
    i, p, d = s.partition('.')
    return '.'.join([i, (d+'0'*n)[:n]])

values = ["19.063694", ">9.734784"]
newValues = []

for value in values:
    if value.startswith('>'):
        newValues.append('>' + truncate(float(value.lstrip('>')), 1))
    else:
        newValues.append(truncate(float(value), 1))

print(newValues) ['19.0', '>9.7']

我的解決方案:

round(df.replace(">30.0",10000),1).replace(10000,">30.0")

我已將所有帶有“>”的字符串更改為大浮點數,然后將它們四舍五入,最后,我將大浮點數替換為同一字符串。

暫無
暫無

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

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