Как получить согласованное поведение при объединении нескольких dtypes в пандах? - PullRequest
0 голосов
/ 22 мая 2018

Я использую панды 0.20.2.

Я получаю противоречивые результаты при агрегировании смешанного фрейма данных dtype.Вот некоторые примеры данных:

import pandas as pd
import numpy as np
df=pd.DataFrame(data=pd.date_range('20100201', periods=10,     
freq='5h3min'),columns=['Start'])
df.loc[:,'End']=df.loc[:,'Start']+pd.Timedelta(4,'h')
df.loc[:,'Value']=42.0
df.loc[:,'Dur']=df.loc[:,'End']-df.loc[:,'Start']

Я хочу применить некоторые функции как к Dur (float), так и к Value (np.timedelta64).В частности, комбинируя np.nansum и np.nanmax, я получаю следующее:

**df.resample('1D',on='Start')['Dur','Value'].agg([np.nansum,np.nanmedian])**
Out[16]: 
            Value          
           nansum nanmedian
Start                      
2010-02-01  210.0      42.0
2010-02-02  210.0      42.0

Столбцы 'Dur' молча игнорируются и отбрасываются, тогда как при применении только np.nansum Iполучить ожидаемый результат, включая оба столбца

f.resample('1D',on='Start')['Dur','Value'].agg([np.nansum])
Out[17]: 
                Dur  Value
             nansum nansum
Start                     
2010-02-01 20:00:00  210.0
2010-02-02 20:00:00  210.0

Как получить то же самое при применении nanmedian?Или как получить все ожидаемые столбцы в многоуровневом фрейме данных, возвращенные в *?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Пользователь Яким Пироженко правильно, ошибка вызвана применением np.isnan в столбце отметки времени внутри функции np.nanmedian

Чтобы избежать этого, вы можете определитьсобственный nanmedian, который будет применять np.median к ненулевым временным меткам:

def mynanmedian(x): 
    return np.median(x[pd.notnull(x)])

df.resample('1D',on='Start')['Dur','Value'].agg([np.nansum,mynanmedian])
# out:
            Dur                     Value
            nansum   mynanmedian    nansum  mynanmedian
Start               
2010-02-01  20:00:00    04:00:00    210.0          42.0
2010-02-02  20:00:00    04:00:00    210.0          42.0
0 голосов
/ 22 мая 2018

np.nanmedian вызывает np.isnan, что не определено для объектов даты и времени (вместо этого следует использовать np.isnat).Поэтому pandas по умолчанию игнорирует столбец, так как функция не может быть вызвана.

Если вы хотите явную ошибку, вы можете использовать

df.groupby(...).agg({c: [np.nansum, np.nanmedian] for c in cols})

...