pandas 1.0.1中使用“datetime64[ns,UTC]”采样的groupby行为不正确?

2024-04-28 21:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图按数据帧按列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

为什么列f493现在包含列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”转换为datetime类型,则会出现更多错误行为

 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'

逗号分隔测向源

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

Tags: samplelambdaname编辑dfdatetimeobjectpd
1条回答
网友
1楼 · 发布于 2024-04-28 21:29:14

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

解决方案是通过^{}Series转换为标量:

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

相关问题 更多 >