Неправильное поведение groupby с выборкой «datetime64 [ns, UTC]» в pandas 1.0.1? - PullRequest
1 голос
/ 10 февраля 2020

Я пытаюсь сгруппировать фрейм данных по столбцу 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.

РЕДАКТИРОВАТЬ: Фактическая проблема начинается здесь .. .

Еще более неправильное поведение, если мы повернем столбец "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'

Разделенный запятыми источник 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

1 Ответ

1 голос
/ 10 февраля 2020

Проблема в том, что возвращается один элемент 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...