[英]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.