【问题标题】:groupby / aggregate dataframe with non-numeric typesgroupby / 非数字类型的聚合数据框
【发布时间】:2018-07-28 11:00:06
【问题描述】:

我有以下情况

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,或者在这种情况下,整个数据帧都相同

我可以执行以下操作来实现 a+b,但如果我尝试在聚合字典中包含类似 'date2':'mean' 之类的内容,它将不起作用并返回 DataError: No numeric types to aggregate

df.groupby(['date1'],as_index=False).agg({'numbers':'sum'})

有什么建议吗?

【问题讨论】:

标签: python pandas


【解决方案1】:

如果每个组的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

【讨论】:

  • 这个答案真聪明!
【解决方案2】:

因为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2013-02-06
    • 2023-02-26
    • 2019-02-27
    • 2012-10-02
    • 2021-01-22
    • 2019-12-20
    相关资源
    最近更新 更多