在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
小心&祝你有美好的一天!