在正常情况,我们是这样做分组统计的:
dft = train_data.groupby('AdID').agg({'AdDate': ['nunique', 'unique']})
得到的结果是这样的:
列变成多行了,其实有两个方法可以设置:
第一种,是重新命名列名:
最简单直接的方式:
dft.columns = pd.Series(['Count', 'List'])
结果是这样的:
已经改好了,直截了当,但是呢,如果列数比较多就比较麻烦了,你还要一个个对应。
第二种,在第一种基础上,利用循环将列名根据需要更改,这样不管多少列,都没问题了:
我们先打印下看看列名是什么格式的:
print(dft.columns)
# 结果是这样的:
# MultiIndex(levels=[['AdDate'], ['nunique', 'unique']],
# codes=[[0, 0], [0, 1]])
print(dft.columns.values)
# 结果是这样的:
# [('AdDate', 'nunique') ('AdDate', 'unique')]
我们看到dft.columns.values其实里面每个列都是一个元组,我们只需要将元组拼接成字符串,然后替换原来的列名就可以了
dft.columns = ['_'.join(col).strip() for col in dft.columns.values]
得到的结果是这样的:
我们再多弄几列看结果:
dft = train_data.groupby('AdID').agg({'AdDate': ['nunique', 'unique', 'first', 'last']})
dft.columns = ['_'.join(col).strip() for col in dft.columns.values]
print(dft)
舒服~
第三种:还有一个方式,是每列单独做,然后拼接,这个其实比较麻烦,这里也记录下,方便使用。而且这个方法还有警告,说是以后会移除掉
dft = train_data.groupby('AdID').AdDate.agg({'Number': 'nunique', 'Values': 'unique'})
得到的结果是这样的:
我把警告也贴出来,就是提示一下。
PS:关于重命名列,其实pandas提供了一个专门的方法:rename,可以这样用:
dft = dft.rename({'AdDate_unique': 'List', 'AdDate_nunique': 'Count'}, axis=1)
但是如果是多层的,不能连接两层去重命名,一般情况的重命名可以使用这个。