Pandas分组统计后列名缺失:如何重命名或创建时指定列名
问题
我写了一段Pandas代码,想要整理数据生成DataFrame,用来做Top10游戏发行商的柱状图。但执行groupby分组统计后,统计结果的列名丢了,没法通过列名选中这一列来绘图;而Pandas的rename函数需要指定原列名,现在列名是空的,想问能不能通过索引重命名该列,或者在创建统计结果时直接指定列名?
原始代码
from itertools import count from platform import platform import pandas as pd import numpy as np import matplotlib.pyplot as plt # 导入csv文件 data = pd.read_csv("video_game.csv") # 数据清洗:转换字符串为数值 + 删除不需要的列 data = data.drop(columns=["NA_players", "EU_players", "JP_players", "Other_players", "Global_players", "User_Count", "Rating", "Critic_Count"]) data['User_Score'] = pd.to_numeric(data['User_Score'], errors='coerce') data = data.replace(np.nan, 0, regex=True) data['User_Score'] = data['User_Score'].astype(float) data['Critic_Score'] = pd.to_numeric(data['Critic_Score'], errors='coerce') data = data.replace(np.nan, 0, regex=True) data['Critic_Score'] = data['Critic_Score'].astype(float) # 筛选评分超过90的游戏及其发行商 data = data[['Publisher','Name', 'Critic_Score']] data = data.query('Critic_Score > 90') data = data.groupby(['Publisher']).size().sort_values(ascending=False) print(data)
解决方案
有两种简单的方法解决这个问题:
方法一:分组统计时直接指定列名
groupby.size()返回的是一个Series(索引是发行商,值是数量),没有列名。可以用reset_index(name='列名')直接把它转换成带列名的DataFrame,一步到位:
把最后一行代码改成:
data = data.groupby(['Publisher']).size().reset_index(name='高评分游戏数量')
这样生成的data就是标准的DataFrame,有Publisher和高评分游戏数量两列,之后可以直接通过列名选中数据,比如取Top10并绘图:
# 取Top10发行商 top10_publishers = data.head(10) # 绘制柱状图 plt.figure(figsize=(12,6)) plt.bar(top10_publishers['Publisher'], top10_publishers['高评分游戏数量']) plt.title('Top10高评分游戏发行商') plt.xlabel('发行商') plt.xticks(rotation=45) plt.ylabel('高评分游戏数量') plt.tight_layout() plt.show()
方法二:对已有结果重命名列
如果已经得到了没有列名的Series,也可以直接修改它的name属性,或者转换成DataFrame后重命名:
方式1:修改Series的name
# 给Series指定名称 data = data.rename('高评分游戏数量') # 转换成DataFrame data = data.reset_index()
方式2:reset_index后用rename重命名
data = data.reset_index() data = data.rename(columns={0: '高评分游戏数量'})
这里因为Series转换成DataFrame后,原数值列的默认列名是0,所以可以直接用这个索引来重命名。
内容的提问来源于stack exchange,提问作者Sinsinful
相关产品推荐
相关产品推荐

