Python pandas groupby agg函数在datetime列上

时间:2016-02-05 17:06:36

标签: python numpy pandas null aggregate

在pandas 0.17.1和numpy 1.10.1中,.agg()函数存在一些虚假行为。在某些数据类型转换中可以找到该问题。以下是一个示例数据框:

import datetime as dt

df_data = [[1,1,2]
    , ['foo', 'bar', 'bar'], [1,2,3]
    , [dt.date(2015,1,5), dt.date(2015,1,3), dt.date(2015,1,15)]
    , [dt.datetime(2015,1,5,23,16,59), dt.datetime(2015,1,5,21,16,59)
    , dt.datetime(2015,1,5,20,16,59)]
    , [dt.timedelta(minutes=60), dt.timedelta(minutes=120), dt.timedelta(minutes=12)]]

df_cols = ['gb', 'a_string', 'a_int', 'a_date', 'a_datetime', 'a_timedelta']

df = pd.DataFrame({i:j for i,j in zip(df_cols, df_data)})

print(df[df_cols])

结果是:

   gb a_string  a_int      a_date          a_datetime  a_timedelta
0   1      foo      1  2015-01-05 2015-01-05 23:16:59     01:00:00
1   1      bar      2  2015-01-03 2015-01-05 21:16:59     02:00:00
2   2      bar      3  2015-01-15 2015-01-05 20:16:59     00:12:00

我想计算例如min()和其他一些统计数据。我可以使用多个groupby object attribute来获取我的统计信息(仅让我们看到min()):

df_g = df.groupby('gb').min()
print(df_g[df_cols[1:]])

结果是正确的:

   a_string  a_int      a_date          a_datetime  a_timedelta
gb                                                             
1       bar      1  2015-01-03 2015-01-05 21:16:59     01:00:00
2       bar      3  2015-01-15 2015-01-05 20:16:59     00:12:00

或者我可以使用agg()函数,但是这样,timedelta个对象发生了一些数据类型转换错误:

df_g_2 = df.groupby('gb').agg({i:np.min for i in df_cols[1:]})
print(df_g_2[df_cols[1:]])

结果如下:

   a_string  a_int      a_date          a_datetime    a_timedelta
gb                                                               
1       bar      1  2015-01-03 2015-01-05 21:16:59  3600000000000
2       bar      3  2015-01-15 2015-01-05 20:16:59   720000000000

如果组中只有datetime个值,则NaT个对象会发生同样的错误。我们来看一个新的数据框:

df_data = [[1,1,2]
    , ['foo', 'bar', 'bar'], [1,2,3]
    , [dt.date(2015,1,5), dt.date(2015,1,3), dt.date(2015,1,15)]
    , [pd.NaT, pd.NaT
    , dt.datetime(2015,1,5,20,16,59)]
    , [dt.timedelta(minutes=60), dt.timedelta(minutes=120), dt.timedelta(minutes=12)]]

df_cols = ['gb', 'a_string', 'a_int', 'a_date', 'a_datetime', 'a_timedelta']

df = pd.DataFrame({i:j for i,j in zip(df_cols, df_data)})

print(df[df_cols])

结果是:

   gb a_string  a_int      a_date          a_datetime  a_timedelta
0   1      foo      1  2015-01-05                 NaT     01:00:00
1   1      bar      2  2015-01-03                 NaT     02:00:00
2   2      bar      3  2015-01-15 2015-01-05 20:16:59     00:12:00

min()完美无缺:

   a_string  a_int      a_date          a_datetime  a_timedelta
gb                                                             
1       bar      1  2015-01-03                 NaT     01:00:00
2       bar      3  2015-01-15 2015-01-05 20:16:59     00:12:00

但是agg()提供了错误的值:

   a_string  a_int      a_date               a_datetime    a_timedelta
gb                                                                    
1       bar      1  2015-01-03                      nan  3600000000000
2       bar      3  2015-01-15 1420489019000000000.0000   720000000000

小心&祝你有美好的一天!

0 个答案:

没有答案