首页 > 解决方案 > 在 pandas 1.0.1 中使用“datetime64 [ns, UTC]”采样的 groupby 行为不正确?

问题描述

我正在尝试按列对数据f493框进行分组,以便对“f496”列中的值进行采样,这就是我得到的

>>> df
       f493                       f496
0  344448.0  2016-11-21 14:26:56+00:00
1  372673.5  2016-08-17 18:15:54+00:00
2  372673.5  2016-08-17 18:15:54+00:00
>>> df["f493"]
0    344448.0
1    372673.5
2    372673.5
Name: f493, dtype: float64
>>> df["f496"]
0    2016-11-21 14:26:56+00:00
1    2016-08-17 18:15:54+00:00
2    2016-08-17 18:15:54+00:00
Name: f496, dtype: object
>>> df = df.groupby("f493").aggregate({"f496": lambda x: x.sample(1)})
>>> df["f496"]
f493
344448.0    2016-11-21 14:26:56+00:00
372673.5    2016-08-17 18:15:54+00:00
Name: f496, dtype: object

为什么 columnf493现在包含 column 的值f493

我预期的结果

       f493                       f496
0  344448.0  2016-11-21 14:26:56+00:00
1  372673.5  2016-08-17 18:15:54+00:00

例如,简单地在列中采样值f496

编辑:实际问题从这里开始......

如果我们将列“f496”转换为日期时间类型,则会出现更多错误行为

 df = df.astype({"f493":"float64", "f496":"datetime64[ns, UTC]"})

输出是一团糟。

>>> df["f496"]
f493
344448.0                            2016-11-21 14:26:56+00:00
372673.5    1   2016-08-17 18:15:54+00:00
Name: f496, dtyp...
Name: f496, dtype: object

我不知道发生了什么事。。

>>> pd.__version__
'1.0.1'

逗号分隔的 df 源

f493,f496
344448.0,2016-11-21 14:26:56+00:00
372673.5,2016-08-17 18:15:54+00:00
372673.5,2016-08-17 18:15:54+00:00

编辑:

>>> df['f496'] = pd.to_datetime(df['f496'])
>>> df = df.groupby("f493").aggregate({"f496": lambda x: x.sample(1)}).reset_index(drop=True)
>>> df
                                                f496
0                          2016-11-21 14:26:56+00:00
1  2   2016-08-17 18:15:54+00:00
Name: f496, dtyp...
>>> df["f496"]
0                            2016-11-21 14:26:56+00:00
1    2   2016-08-17 18:15:54+00:00
Name: f496, dtyp...
Name: f496, dtype: object

标签: pythonpandasdataframedatetime

解决方案


问题是返回了一项Series,而不是标量。

解决方案是通过以下方式转换Series为标量Series.iat

df['f496'] = pd.to_datetime(df['f496'])
df = df.groupby("f493").agg({"f496": lambda x: x.sample(1).iat[0]}).reset_index()
print (df)
       f493                      f496
0  344448.0 2016-11-21 14:26:56+00:00
1  372673.5 2016-08-17 18:15:54+00:00

顺便说一句,这似乎是错误pandas 1.0.1,因为在 pandas 0.23.1 中,两种解决方案都可以完美运行:

df['f496'] = pd.to_datetime(df['f496'])
df = df.groupby("f493").agg({"f496": lambda x: x.sample(1)}).reset_index()
print (df)
       f493                      f496
0  344448.0 2016-11-21 14:26:56+00:00
1  372673.5 2016-08-17 18:15:54+00:00

推荐阅读