Pandas Dataframe Timedelta Mean() 未显示正确的值

问题描述 投票:0回答:2

我搜索了又搜索,但没有找到解决方案,或者只是找到为什么会发生这种情况的答案。

我正在尝试确定我的 pandas 数据框中

mean()
的每个行政区的
Request_Closing_Time
。当我
groupby
自治市镇然后获取请求关闭时间的平均值时,我得到非常大的值,
13
44
天,甚至
87,426
天以获得一个结果。最大值仅为
24
天,整个数据帧的平均值仅为
4
小时。如果我使用 get_group 命令挑选出一个单独的行政区,那么我似乎会得到一个更正常的答案,我认为这是正确的。

有什么想法可以解释为什么当

groupby
仅由行政区时平均值相差如此之远吗?

In [283]:nyc_sr_calls_trimmed.describe()
Out[283]:        Unique Key     Request_Closing_Time       Incident Zip
         count  3.006980e+05    298534  298083.000000
         mean   3.130054e+07    0 days 04:18:51.832782865   10848.888645
         std    5.738547e+05    0 days 06:05:22.141833856   583.182081
         min    3.027948e+07    0 days 00:01:00 83.000000
         25%    3.080118e+07    0 days 01:16:33 10310.000000
         50%    3.130436e+07    0 days 02:42:55.500000  11208.000000
         75%    3.178446e+07    0 days 05:21:00 11238.000000
         max    3.231065e+07    24 days 16:52:22    11697.000000

In [284]: nyc_sr_calls_trimmed['Request_Closing_Time'].mean()
Out[284]:Timedelta('0 days 04:18:51.832782865')

In [285]:by_burrough = nyc_sr_calls_trimmed.groupby(['Borough'])
         by_burrough['Request_Closing_Time'].mean(numeric_only=None).dt.floor('s')

Out[285]:Borough
         BRONX              -13 days +03:21:47
         BROOKLYN           -13 days +03:18:24
         MANHATTAN          -36 days +14:38:51
         QUEENS             -16 days +07:37:05
         STATEN ISLAND      -44 days +22:01:24
         Unspecified     -87426 days +14:15:03
         Name: Request_Closing_Time, dtype: timedelta64[ns]

In [286]:b = by_burrough.get_group('QUEENS')
         b['Request_Closing_Time'].mean(numeric_only=False)

Out[286]:Timedelta('0 days 04:52:16.450111002')

如有任何帮助,我们将不胜感激。我不确定我没有考虑或考虑到什么。谢谢。

python pandas dataframe pandas-groupby mean
2个回答
0
投票

“如果我使用 get_group 命令选出一个单独的行政区,那么我似乎会得到一个更正常的答案,我认为这是正确的”。

既然您提到了上述内容,我会尝试分别获取每个行政区的

Request_Closing_Time
的平均值,如下所示:

by_burrough["Request_Closing_Time"].apply(lambda df_group: df_group.mean(numeric_only=False))

by_burrough.apply(lambda df_group: df_group["Request_Closing_Time"].mean(numeric_only=False))

0
投票

对我来说,timedelta dtype 列上的

.describe()
太离谱了,正如您所看到的。 我发现这个问题可以通过
numeric_only=False
来解决,根据 这个答案

但是,我使用的是Dask,Dask不支持

numeric_only=False

所以,我的解决方案是将日期时间转换为 int

df[col].astype('int64')//1e9  # convert to secs since epoch (1970)

然后相减然后平均。

完整解决方案:

def convert_datetime_col_as_day_since_epoch(df: pd.DataFrame) -> pd.DataFrame:
    return pd.concat([
        df, 
        *[
            pd.DataFrame({f"{col}_epoch": df[col].astype('int64')//1e9//(24 * 60 * 60)}, dtype='int64')
            for col, dtype in df.dtypes.to_dict().items() if dtype == '<M8[ns]'
        ],
    ], axis=1)

df = df.map_partitions(convert_datetime_col_as_day_since_epoch)

df['DATETIME_DIFF'] = df['DATE1_epoch'] - df['DATE2_epoch']

df.describe()
© www.soinside.com 2019 - 2024. All rights reserved.