2015-08-15 137 views
0

在我的大熊貓,數據是這樣的:
enter image description here如何獲取小數的小數部分的第一位數?

(原始數據就像2.1, 3.7, 5.6,而0以下。)

我想看到的小數部分的第1位的分佈。 (即,6 for 4.6)。我該怎麼做?

我想過15.1 % 1,但是它會返回0.09999999999999964

+4

'(X * 10)%10'? –

+1

致所有答覆者:由於OP提到熊貓,可能需要附上apply/lambda。例如。 'df.apply(lambda x:your_code)'。這對OP來說也更加明顯:'df = pd.DataFrame([0.5,4.6,7.2])' – JohnE

+0

@UmaKanth,這真的讓人印象深刻...... – cqcn1991

回答

3

對於正數,您可以先使用乘法,然後使用模。

x = 15.6 
x *= 10 # 156 
x %= 10 # 6 

如果它們是消極的,

def get(x): 
    return (x * 10) % 10 
x = - 15.6 
print get(abs(x)) 

如捅提出了一個更清潔的方式。

abs(x * 10) % 10 

如果你有一個名爲DF數據框,可以附上這樣的:

df.apply(lambda x: abs(x * 10) % 10) 
+1

我其實不是Python開發者。如果你想添加任何細節,你實際上可以編輯我的答案。我非常感激。 –

+2

'abs(x * 10)%10'適用於正數和負數。 – poke

1

你可以嘗試:

int(str(x).split('.')[1][0]) 

這將轉換爲字符串,各執。並採取第二部分的第一個字符,然後把它變回一個整數。你得到奇怪值的原因是0.1是二進制的無理數。

您還可以使用:

int(x * 10.0) % 10 

這將確保你有一個整數,(你可能需要使用math.round爲好)。

舉個例子:

>>> pf = pandas.DataFrame([0.5, 4.6, 7.2, 9.8, 36.0]) 
>>> pf 
     0 
0 0.5 
1 4.6 
2 7.2 
3 9.8 
4 36.0 
>>> pf[0] 
0  0.5 
1  4.6 
2  7.2 
3  9.8 
4 36.0 
Name: 0, dtype: float64 
>>> pf.apply(lambda x: int(x[0]*10.0)%10) 
0 5 
dtype: int64 
>>> pf.apply(lambda x: int(x[0]*10.0)%10, 1) 
0 5 
1 6 
2 2 
3 8 
4 0 
dtype: int64 
>>> 

在測試-ve編號:

>>> pf = pandas.DataFrame([0.5, 4.6, 7.2, -9.8, 36.0]) 
>>> df = pf.apply(lambda x: int(x[0]*10.0)%10, 1) 
>>> df 
0 5 
1 6 
2 2 
3 2 
4 0 
dtype: int64 
>>> df = pf.apply(lambda x: int(abs(x[0])*10.0)%10, 1) 
>>> df 
0 5 
1 6 
2 2 
3 8 
4 0 
dtype: int64 
>>> 

所以我們最後的答案是:

pf.apply(lambda x: int(abs(x[0])*10.0)%10, 1) 

我也試過字符串的方法:

>>> pf.apply(lambda x:int(str(x[0]).split('.')[1][0]), 1) 
0 5 
1 6 
2 2 
3 8 
4 0 
dtype: int64 
+0

哎呀!更正! –