#python #pandas #math #statistics #data-science
#python #pandas #математика #Статистика #наука о данных
Вопрос:
У меня есть фрейм данных, который выглядит следующим образом —
37 days 19:07:00
69 days 02:32:00
44 days 00:38:00
14 days 07:30:00
14 days 23:03:00
41 days 16:41:00
Я хочу преобразовать это время в месяцы, для которых я использую этот код —
df_new['difference'] = df_new['time'].dt.total_seconds().div(60).astype(int)
Это дает мне результаты, но в течение дней менее 30 он возвращает мне 0 месяцев, поэтому я хочу десятичное значение этого столбца вместо абсолютного числа. Как я могу это сделать? Моя конечная цель — найти среднее значение этого столбца.
Мой текущий вывод выглядит как столбец один, а желаемый результат находится в столбце 2.
Current
1
2
2
5
0
0
Desired
1
2
2
5
0.2
0.5
Ответ №1:
Измените astype(int) на astype(float)
код:
df_new['difference'] = df_new['time'].dt.total_seconds().div(60).astype(float)
Комментарии:
1. Это сработало. Спасибо. Как я могу ограничить десятичные дроби до 2 цифр после десятичной дроби?
2. Эй, @bella, попробуй метод round(). Код: round(df_new[‘разница’], 2) . Это означает, что вам нужно только 2 десятичных числа.
3. @Isabelle если мое решение сработало для вас, пожалуйста, отметьте мой ответ символом зеленой галочки, который вы можете найти в левой части ответа (он будет зеленым после щелчка). Спасибо.
Ответ №2:
.astype(int)
вернет целое число, исходя из того, что вам нужно, вы должны использовать .astype(float)
.round(2)
значения будут округлены до 2 знаков после запятой, но я бы посоветовал округлить до 2 знаков после запятой после того, как вы получили среднее значение. Обратите внимание, что pandas будет отображать только до 6 знаков после запятой при печати выходных данных. Однако будьте уверены, что при вызове значения будет соблюдена указанная вами точность.
>>> df = pd.DataFrame([[1,2],[3,4]], columns=['a','b'])
>>> df['c'] = df['a'].div(7).astype(float)
>>> df['d'] = df['a'].div(7).astype(float).round(2)
>>> df['e'] = df['a'].div(7).astype(float).round(7) # only 6 d.p. displayed
>>> df['f'] = df['a'].div(7).astype(float).round(10) # only 6 d.p. displayed (uh-oh!)
Но когда вы «вызываете» значения, вы увидите указанную точность:
>>> df['d'][0]
0.1428571
>>> df['e'][0]
0.1428571429
Комментарии:
1. Это сработало. Спасибо. Как я могу ограничить десятичные дроби до 2 цифр после десятичной дроби?
2. Что касается ссылки ниже, все, что вам нужно сделать, это добавить .round(2) , но я предложу сначала усреднить значения перед округлением. pandas.pydata.org/pandas-docs/stable/reference/api /…
Ответ №3:
Вот способ и использование np.where
news=pd.to_timedelta(s).dt.total_seconds().div(30*60*60*24).round(1)
news=pd.Series(np.where(news>1.0,news.round(0),news.round(1))).astype(object)
news
Out[919]:
0 1
1 2
2 2
3 0.5
4 0.5
5 1
dtype: object