5 回答
TA貢獻1946條經驗 獲得超4個贊
這是一個應該很容易理解的解決方案。我可以制作一個oneline,你也想要那個。
mylist = [1.3, 2.6, 3.1]
number = 0
fractions = 0
for a in mylist:
(a,b)=str(a).split('.')
number = number + int(a)
fractions = fractions + int(b)
print ("Number: " + str(number))
print ("Fractions: " + str(fractions))
這給出:
Number: 6
Fractions: 10
TA貢獻1828條經驗 獲得超6個贊
不要使用str(x).split('.')!
一條評論和另外兩個答案目前建議使用以下方法獲取數字的整數和小數x部分
i,f = (int(s) for s in str(x).split('.'))
雖然這確實給出了結果,但我認為這是一個壞主意。
問題是,如果您期望得到有意義的結果,則需要顯式指定小數部分的精度。"1.20"和"1.2"是相同數字的兩個字符串表示形式,但20和2是兩個非常不同的整數。此外,浮點數會受到精度誤差的影響,您很容易會發現自己使用的是類似 的數字"1.19999999999999999999999",它與 之間只有很小的舍入誤差"1.2",但使用這種方法會產生完全不同的結果str(x).split('.')。
避免這種混亂行為的一種方法是設置一個精度,即小數位數,并堅持下去。例如,在處理貨幣價值時,我們習慣于談論分;盡管 1.5 歐元和 1.50 歐元在技術上都是有效的,但您總是會聽到人們說“一歐元五十”而不是“一歐元五”。如果你聽到有人說“一歐元五”,它實際上意味著 1.05 歐元。我們總是精確地添加兩位小數。
通過這種方法,不存在1.2成為(1,2)或(1,20)或的混亂行為(1,1999999999)。如果將小數位數固定為 2,則將1.2始終映射到(1,20),就是這樣。
更標準的方式
以下是在 python 中獲取數字的整數和小數部分的兩種標準方法:
x = 1.20
# method 1
i = int(x)
f = x - i
# i = 1 and f = 0.2; i is an int and f a float
# method 2
import math
f, i = math.modf(x)
# i = 1.0 and f = 0.2; i and f are both floats
(編輯:還有第三種方法,pandas 的divmod函數。請參閱user2314737 的回答。)
完成此操作后,您可以f通過將小數部分乘以所選的 10 次方并將其轉換為整數,將其轉換為整數:
f = int(f * 100)
# f = 20
最后,您可以將此方法應用于整個列表:
data = [13.0, 14.20, 12.299, 4.414]
def intfrac_pair(x, decimal_places):
i = int(x)
f = int((10**decimal_places) * (x - i))
return (i, f)
data_as_pairs = [intfrac_pair(x, 2) for x in data]
# = [(13, 0), (14, 20), (12, 30), (4, 41)]
sum_of_integer_parts = sum(i for i,f in data_as_pairs) # = 43
sum_of_fractional_parts = sum(f for i,f in data_as_pairs) # = 91
TA貢獻1815條經驗 獲得超13個贊
divmod您可以在列上使用
df = pd.DataFrame([1.2, 2.3, 3.4, 4.5, 0.1])? ? ? ? ? ? ? ? ? ? ? ? ? ?
df? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
#? ? ? 0
# 0? 1.2
# 1? 2.3
# 2? 3.4
# 3? 4.5
# 4? 0.1
df['i'], df['d'] = df[0].divmod(1)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
df? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
# Out:?
#? ? ? 0? ? i? ? d
# 0? 1.2? 1.0? 0.2
# 1? 2.3? 2.0? 0.3
# 2? 3.4? 3.0? 0.4
# 3? 4.5? 4.0? 0.5
# 4? 0.1? 0.0? 0.1
要將按行求和為整數(需要精度p=1,這里我假設原始浮點數僅包含一位十進制數字):
p = 1
df['s'] = (df['i']+10**p*df['d'].round(decimals=p)).astype(np.int)
df? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
# Out:?
#? ? ? 0? ? i? ? d? s
# 0? 1.2? 1.0? 0.2? 3
# 1? 2.3? 2.0? 0.3? 5
# 2? 3.4? 3.0? 0.4? 7
# 3? 4.5? 4.0? 0.5? 9
# 4? 0.1? 0.0? 0.1? 1
按列求和:
df.sum()? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
# Out:?
# 0? ? 11.5
# i? ? 10.0
# d? ? ?1.5
注意:這僅適用于正整數,例如divmod(-3.4, 1)returns (-4.0, 0.6)。
TA貢獻1859條經驗 獲得超6個贊
以下應該有效:
df['total_number']=[sum([int(i) for i in str(k).split('.')]) for k in df.version_number]TA貢獻1712條經驗 獲得超3個贊
謝謝大家。我最終以一種相當愚蠢但有效的方式做到了。在分割之前,我將其轉換為字符串:
Allfiles['Version'] = Allfiles['Version'].round(3).astype(str)
請注意,我四舍五入為 3 位數字,因為像 2.111 這樣的數字已轉換為 2.11099999999999999999
然后我只是進行了拆分,為次要版本創建了一個新列(并將主要版本放在原始列中)
Allfiles[['Version', 'minor']] = Allfiles['Version'].str.split('.', expand=True)然后我再次將兩個文件轉換為整數,并在第一列中求和。
Allfiles['Version'] = Allfiles['Version']+Allfiles['minor']
(我的數據框名稱是 Allfiles 和列版本,正如您可以想象的那樣。
添加回答
舉報
