我有以下情况
date_range = pd.date_range('20180101', '20180105')
date_list = list(itertools.chain.from_iterable(itertools.repeat(date, 2) for date in date_range))
num_list = np.random.randint(1,100,size=(10))
date2 = ['2018-12-31']*10
df = pd.DataFrame({'date1':date_list,'numbers':num_list,'date2':date2})
显示此数据框提供
date1 date2 numbers
0 2018-01-01 2018-12-31 38
1 2018-01-01 2018-12-31 2
2 2018-01-02 2018-12-31 8
3 2018-01-02 2018-12-31 51
4 2018-01-03 2018-12-31 16
5 2018-01-03 2018-12-31 22
6 2018-01-04 2018-12-31 43
7 2018-01-04 2018-12-31 76
8 2018-01-05 2018-12-31 47
9 2018-01-05 2018-12-31 50
我想获得一个新的数据帧,a)按date1分组,b)总结数字列中每个date1的值,c)保留date2值(我们可以假设它们是相同的每个date1,或者在这种情况下,整个数据框都是相同的
我可以执行以下操作来获得+ b,但如果我尝试包含类似' date2':'则表示'在聚合字典中,它将无法工作并返回DataError:没有要聚合的数字类型
df.groupby(['date1'],as_index=False).agg({'numbers':'sum'})
任何建议?
答案 0 :(得分:2)
如果每组的date2
相同,您似乎需要:
df.groupby(['date1', 'date2'],as_index=False).agg({'numbers':'sum'})
或者需要按first
汇总:
df.groupby(['date1'],as_index=False).agg({'numbers':'sum','date2':'first'})
但如果mean
需要datetime
,则有点复杂:
df['date2'] = pd.to_datetime(df['date2'])
f = lambda x: pd.to_datetime(x.values.astype(np.int64).mean())
df1 = df.groupby(['date1'],as_index=False).agg({'numbers':'sum','date2':f})
print (df1)
date1 numbers date2
0 2018-01-01 159 2018-12-31
1 2018-01-02 104 2018-12-31
2 2018-01-03 75 2018-12-31
3 2018-01-04 98 2018-12-31
4 2018-01-05 184 2018-12-31
答案 1 :(得分:0)
因为c):
保留date2值(对于每个date1,我们可以假设它们是相同的,或者在这种情况下,对于整个数据帧都是相同的
...您可以将其添加到group by子句中:
df.groupby(['date1', 'date2'],as_index=False).agg({'numbers':'sum'})
......给予:
date1 date2 numbers
0 2018-01-01 2018-12-31 35
1 2018-01-02 2018-12-31 52
2 2018-01-03 2018-12-31 104
3 2018-01-04 2018-12-31 96
4 2018-01-05 2018-12-31 151