2017-01-11 5 views
1

Я действительно новичок в python и испытываю трудности с этой проблемой. я должен взять следующую информацию из кадра данных и обеспечить его среднее [ответ предположит вернуть единственное число]Проблема с округлением

Вот колонна из кадра данных:

Country 
China     93.0 
United States   286.0 
Japan     149.0 
United Kingdom  124.0 
Russian Federation 214.0 
Canada    296.0 
Germany    165.0 
India     26.0 
France    166.0 
South Korea   221.0 
Italy     109.0 
Spain     106.0 
Iran     119.0 
Australia    231.0 
Brazil     59.0 
Name: Energy Supply per Capita, dtype: float64 

Теперь с помощью следующее:

Per_capita = Top15.loc[:,['Energy Supply per Capita']].mean() 
Per_capita.iloc[0] 

я получаю:

157.59999999999999 

поэтому я попытался с помощью функции round:

Per_capita = Per_capita.round(decimals = 1) 

Я все еще получаю тот же результат, если у меня есть какие-либо знаков после запятой. Он изменяется только тогда, когда я ставил десятичные числа в 0, и это дает 158, которые я предполагаю, это не тот ответ, который они ищут.

, если я не использую функцию iloc я получаю хороший 1 десятичного ответа хотя

Energy Supply per Capita 157.6 

я хочу, чтобы получить 2 десятичный ответ на выше

+0

Добро пожаловать в StackOverflow. Есть ли вопрос, который я пропустил? –

+0

извините, что я ищу ответ на 2 десятичных слова выше. –

ответ

2

Это не проблема округления; это проблема отображения. Число 157.6 не является точно представимым в арифметике с двойной точностью, его представительское число с двойной точностью немного меньше 157,6. Поплавки Python и float NumPy отличаются тем, как справляться с этой проблемой при отображении номеров в консоли. Пример:

x = 157.6 
df = pd.DataFrame({'a': [x]}) 
y = df.iloc[0,0] 

Теперь, если вы наберете x в консоли, вы получите 157,6, но если вы наберете y, вы получаете 157.59999999999999. Тем не менее, x == y - правда. В чем дело?

Различные типы, вот и все: x является поплавком Python, y является float NumPy, поскольку он поступает из dataframe (pandas использует NumPy под капотом). Следовательно, косметические отличия в выступлениях. Числа одинаковы, для округления ничего не нужно.

Как избежать уродливых 9s: используйте print(y), или в вашем примере, print(Per_capita.iloc[0]). Функция печати будет представлять поплавки с хорошим способом, будь то NumPy float или Python плавает.

+0

Большое вам спасибо, что исправил его. Но грейдер все еще показывает ответ как неправильный. О, хорошо, не знаю, что еще я могу сделать. –

+0

Вы также можете преобразовать в float Python с 'float (Per_capita.iloc [0])', хотя я не знаю, как работает грейдер. – FTP

0

Я считаю, вы решаете назначение Coursera. Просто используйте следующий код, если ответ должен быть числом без десятичных знаков:

Per_capita = int(Top15.mean()) 

Если вам нужен ответ, чтобы быть 157,6 использование:

Per_capita = Top15.mean() 
+0

Итак, Top15 - это dataframe, я хочу использовать конкретный столбец. Поэтому я использовал: 'code'Top15 ['Energy Supply per Capita']. Mean() . Получая то же значение –

+0

, функция mean() может быть вызвана как в серии, так и в кадре данных в пандах. Было бы полезно, если вы отредактируете свой вопрос, чтобы включить полную информацию о вашем фрейме данных. – Mahesh

0

это возможно, связанные с данными 157,59999999999999

берут пример следующим образом:

б = 157,59999999999999

печати нп.круглые (B, десятичные = 0)

печати np.round (B, десятичные = 1)

печати np.round (б, десятичные = 4)

158,0

157,6

157,6

, если изменить значение B:

Ь = 157.5932321231341231

печати np.round (B, десятичных знаков = 0)

печати np.round (B, десятичные = 1)

печати np.round (B, десятичные = 2)

158,0

157,6

157,59

это время работы, так что это может быть, в зависимости от данных, .999999

для данных, результат для знаков после запятой = 2,3,4, все результаты одинаковы.