Вернуть NaN для pandas .groupby (). Sum () полей timedelta - PullRequest
2 голосов
/ 10 февраля 2020

При выполнении df.groupby().sum() в pandas nan с неожиданно преобразуется в 0. Это было отмечено в этом билете GitHub . Билет предполагает, что использование groupby().sum(min_count=1) правильно вернет ожидаемый nan. К сожалению, он не работает для timedeltas (см. Полный рабочий пример ниже).

Существуют ли обходные пути для того, чтобы сохранить nan в groupy().sum() для полей timedelta?

import pandas as pd
from datetime import datetime, date, timedelta

data = [[date(year=2020,month=2,day=1), timedelta(hours=1, minutes=10),timedelta(hours=2, minutes=10) ],
    [date(year=2020,month=2,day=2), None,    timedelta(hours=2, minutes=10) ],
    [date(year=2020,month=2,day=3), timedelta(hours=1, minutes=10),timedelta(hours=2, minutes=10) ],
    [date(year=2020,month=2,day=3), timedelta(hours=1, minutes=10),timedelta(hours=2, minutes=10) ]
    ] 

df = pd.DataFrame(data, columns = ['date', 'duration', 'total']) 
df.set_index(pd.DatetimeIndex(df['date']), inplace=True)

res=df.groupby(level=0).sum(min_count=1)
display(res)

Ожидаемое:

date  | duration | total
2020-02-01 | 01:10:00 | 02:10:00
2020-02-02 | NaT | 02:10:00
2020-02-03 | 02:20:00 | 04:20:00

Но получение

date  | duration | total
2020-02-01 | 01:10:00 | 02:10:00
2020-02-02 | 00:00:00| 02:10:00
2020-02-03 | 02:20:00 | 04:20:00

1 Ответ

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

Найден обходной путь, а именно:

res=df.groupby(level=0).apply(lambda x: x.sum(min_count=1))

вместо

res=df.groupby(level=0).sum(min_count=1)

...