在正常情况,我们是这样做分组统计的:

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)

但是如果是多层的,不能连接两层去重命名,一般情况的重命名可以使用这个。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐