Я пытаюсь выполнить следующую операцию:
pd.concat([A,B], axis = 1).groupby("status_reason")["closing_time"].mean()
Где
- A - это серия с именем "status_reason" (Категориальные значения)
- Bявляется серией с именем «Closing_time» (значения TimeDelta)
Пример:
In : A.head(5)
Out:
0 -1 days +11:35:00
1 -10 days +07:13:00
2 NaT
3 NaT
4 NaT
Name: closing_time, dtype: timedelta64[ns]
In : B.head(5)
Out:
0 Won
1 Canceled
2 In Progress
3 In Progress
4 In Progress
Name: status_reason, dtype: object
Произошла следующая ошибка:
DataError: No numeric types to aggregate
Обратите внимание: я пыталсячтобы выполнить среднее, даже изолируя каждую категорию
Теперь я увидел несколько вопросов, похожих на мой онлайн, поэтому я попробовал это:
pd.to_timedelta(pd.concat([pd.to_numeric(A),B], axis = 1).groupby("status_reason")["closing_time"].mean())
, который просто конвертирует Timedelta в int64и наоборот. Но результат был довольно странный (слишком большое число)
Чтобы исследовать ситуацию, я написал следующий код:
xxx = pd.concat([A,B], axis = 1)
xxx.closing_time.mean()
#xxx.groupby("status_reason")["closing_time"].mean()
Второй ряд РАБОТАЕТ КАЧЕСТВЕННО, без преобразования Timedelta вInt64. Третья строка НЕ работает и возвращает снова DataError.
Я так запутался здесь! Что я пропустил?
Я хотел бы видеть среднее значение "времени закрытия" для каждой "причины состояния"!
РЕДАКТИРОВАТЬ
Если я попытаюсь сделать это: (изолировать строки с определенным статусом без группировки)
yyy = xxx[xxx["status_reason"] == "In Progress"]
yyy["closing_time"].mean()
В результате:
Timedelta('310 days 21:18:05.454545')
Но если я сделаю это: (Изолировать строкис определенной группировкой статуса)
yyy = xxx[xxx["status_reason"] == "In Progress"]
yyy.groupby("status_reason")["closing_time"].mean()
Результат снова:
DataError: No numeric types to aggregate
Наконец, если я сделаю это: (преобразование и преобразование обратно) (ДАВАЙТЕ ПОЗВОНИТЬ ЭТО: Специальный пример )
yyy = xxx[xxx["status_reason"] == "In Progress"]
yyy.closing_time = pd.to_numeric (yyy.closing_time)
pd.to_timedelta(yyy.groupby("status_reason")["closing_time"].mean())
Вернемся к первой замеченной мной проблеме:
status_reason
In Progress -105558 days +10:08:05.605064
Name: closing_time, dtype: timedelta64[ns]
EDIT2
Если я это сделаюthis: (преобразовать в секунды и преобразовать обратно)
yyy = xxx[xxx["status_reason"] == "In Progress"]
yyy.closing_time = A.dt.seconds
pd.to_timedelta(yyy.groupby("status_reason")["closing_time"].mean(), unit="s" )
Результат будет
status_reason
In Progress 08:12:38.181818
Name: closing_time, dtype: timedelta64[ns]
Тот же результат произойдет, если я удалю NaN или заполню их 0:
yyy = xxx[xxx["status_reason"] == "In Progress"].dropna()
yyy.closing_time = A.dt.seconds
pd.to_timedelta(yyy.groupby("status_reason")["closing_time"].mean(), unit="s" )
НО цифры сильно отличаются от того, что мы видели в первом редактировании! ( Специальный пример )
-105558 days +10:08:05.605064
Кроме того, позвольте мне запустить тот же код ( Специальный пример ) с dropna ():
310 days 21:18:05.454545
И снова, давайте запустим тот же код ( Специальный пример ) с fillna (0):
3 days 11:14:22.819472
Это ни к чему не приведет. Я, вероятно, должен подготовить экспорт этих данных и выложить их куда-нибудь: Вот и мы