从Pandas绘制特定数据点的图表

3

我正在尝试构建一个处理棒球统计数据的程序。我要求用户输入一个球队,然后代码通过我创建的panda搜索匹配用户输入的“teamID”的值。

我已经尝试按“teamID”分组,但是在for循环之前还需要进行索引。

def AttendancePlot(teams,team_pick):

    fig, ax = plt.subplots()
    group_by_teamID = teams.groupby(by=['teamID'])
    print group_by_teamID

    for i in group_by_teamID.index:
        if i == team_pick:
            ax.scatter(teams['yearID'][i], teams['attendance'][i], color="#4DDB94", s=200)
            ax.annotate(i, (teams['yearID'][i], teams['attendance'][i]),
               bbox=dict(boxstyle="round", color="#4DDB94"),
               xytext=(-30, 30), textcoords='offset points',
               arrowprops=dict(arrowstyle="->", connectionstyle="angle,angleA=0,angleB=90,rad=10"))

我是如何创建Panda的
teams = pd.read_csv('Teams.csv')
salaries = pd.read_csv('Salaries.csv')
names = pd.read_csv('Names.csv')

teams = teams[teams['yearID'] >= 1985]
teams = teams[['yearID', 'teamID', 'Rank', 'R', 'RA', 'G', 'W', 'H', 'BB',    'HBP', 'AB', 'SF', 'HR', '2B', '3B', 'attendance']]
teams = teams.set_index(['yearID', 'teamID'])

salaries_by_yearID_teamID = salaries.groupby(['yearID', 'teamID'])  ['salary'].sum()
teams = teams.join(salaries_by_yearID_teamID)

print teams.head(15)

输出的熊猫。
          Rank    R   RA    G     ...       2B  3B  attendance      salary
yearID teamID                          ...                                     
1985   ATL        5  632  781  162     ...      213  28   1350137.0   14807000.0
       BAL        4  818  764  161     ...      234  22   2132387.0  11560712.0
       BOS        5  800  720  163     ...      292  31   1786633.0  10897560.0
       CAL        2  732  703  162     ...      215  31   2567427.0  14427894.0

我希望能够显示特定输入团队每年的出勤率散点图。目前只能得到一个空白图表且没有错误提示。

你能添加一个数据框的样本吗? - Valentino
teams = pd.read_csv('Teams.csv') salaries = pd.read_csv('Salaries.csv') names = pd.read_csv('Names.csv')teams = teams[teams['yearID'] >= 1985] teams = teams[['yearID', 'teamID', 'Rank', 'R', 'RA', 'G', 'W', 'H', 'BB', 'HBP', 'AB', 'SF', 'HR', '2B', '3B', 'attendance']] teams = teams.set_index(['yearID', 'teamID'])salaries_by_yearID_teamID = salaries.groupby(['yearID', 'teamID'])['salary'].sum() teams = teams.join(salaries_by_yearID_teamID)print(teams.head(15))此代码输出以下列表... - Greg Milani
排名 R RA G ... 2B 3B 出席人数 薪水 yearID teamID ...
1985 ATL 5 632 781 162 ... 213 28 1350137.0 14807000.0 BAL 4 818 764 161 ... 234 22 2132387.0 11560712.0 BOS 5 800 720 163 ... 292 31 1786633.0 10897560.0 CAL 2 732 703 162 ... 215 31 2567427.0 14427894.0 CHA 3 736 720 163 ... 247 37 1669888.0 9846178.0
- Greg Milani
请在问题中添加以下内容:点击[编辑]按钮(https://stackoverflow.com/posts/56094705/edit)以编辑您的问题。这样会更易读。 - Valentino
@Valentino 刚刚编辑了,抱歉! - Greg Milani
1个回答

2
不需要在这里使用groupby(),通常情况下,当您想对一些行应用某些数学时才会使用groupby()。您需要的是正确选择数据。假设数据框架为teams,此函数将绘制给定team_pick队伍的年份(x轴)与出勤率(y轴):
def AttendancePlot(teams, team_pick):
    teamdata = teams.loc[teams.index.get_level_values('teamID') == team_pick]
    plt.scatter(teamdata.index.levels[0], teamdata['attendance'])
    plt.show()

我把注释留给你。
关键在于这一行:teamdata = teams.loc[teams.index.get_level_values('teamID') == team_pick]
teams.index.get_level_values('teamID') == team_pick 对多级索引进行选择,允许您选择所有团队为team_pick的行。
因此,teamdata是包含给定团队所有行的数据框架。
这称为Pandas索引。还请参阅Pandas高级索引

非常感谢!我正在努力更好地理解Python中数据可视化背后的逻辑,这让我有些困惑。你是最棒的! - Greg Milani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接