gpt4 book ai didi

python - Pandas Timedelta 平均值返回错误 "No numeric types to aggregate"。为什么?

转载 作者:行者123 更新时间:2023-12-04 01:39:09 28 4
gpt4 key购买 nike

我正在尝试执行以下操作:

pd.concat([A,B], axis = 1).groupby("status_reason")["closing_time"].mean()

在哪里
  • A 是名为“status_reason”的系列(分类值)
  • B 是一个名为“close_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]

    编辑2

    如果我这样做:(转换为秒并转换回来)
    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

    这无处可去。我可能应该准备导出这些数据,并将它们张贴在某个地方: Here we go

    最佳答案

    从阅读 Github 上对此问题的讨论 here ,您可以通过为均值计算指定 numeric_only=False 来解决此问题,如下所示

    pd.concat([A,B], axis = 1).groupby("status_reason")["closing_time"] \
    .mean(numeric_only=False)

    关于python - Pandas Timedelta 平均值返回错误 "No numeric types to aggregate"。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58306309/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com