Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 无法将数据帧打印为barh,因为TypeError:Empty';数据帧';:没有要打印的数字数据_Python 3.x_Pandas_Matplotlib - Fatal编程技术网

Python 3.x 无法将数据帧打印为barh,因为TypeError:Empty';数据帧';:没有要打印的数字数据

Python 3.x 无法将数据帧打印为barh,因为TypeError:Empty';数据帧';:没有要打印的数字数据,python-3.x,pandas,matplotlib,Python 3.x,Pandas,Matplotlib,我一直在这个网站和谷歌上搜索,试图解决这个问题。 似乎我在制作可绘图仪数据框时缺少了一个基本概念。 我已尝试确保为“团队”提供一列字符串,为“积分”提供一列整数 我仍然得到:TypeError:Empty'DataFrame':没有要打印的数字数据 import csv import pandas import numpy import matplotlib.pyplot as plt from matplotlib.ticker import StrMethodFormatter set_o

我一直在这个网站和谷歌上搜索,试图解决这个问题。
似乎我在制作可绘图仪数据框时缺少了一个基本概念。
我已尝试确保为“团队”提供一列字符串,为“积分”提供一列整数
我仍然得到:TypeError:Empty'DataFrame':没有要打印的数字数据

import csv
import pandas
import numpy
import matplotlib.pyplot as plt
from matplotlib.ticker import StrMethodFormatter

set_of_teams = set()

def load_epl_games(file_name):
    with open(file_name, newline='') as csvfile:
        reader = csv.DictReader(csvfile)
        raw_data = {"HomeTeam": [], "AwayTeam": [], "FTHG": [], "FTAG": [], "FTR": []}
        for row in reader:
            set_of_teams.add(row["HomeTeam"])
            set_of_teams.add(row["AwayTeam"])
            raw_data["HomeTeam"].append(row["HomeTeam"])
            raw_data["AwayTeam"].append(row["AwayTeam"])
            raw_data["FTHG"].append(row["FTHG"])
            raw_data["FTAG"].append(row["FTAG"])
            raw_data["FTR"].append(row["FTR"])
        data_frame = pandas.DataFrame(data=raw_data)
    return data_frame

def calc_points(team, table):
    points = 0
    for row_number in range(table["HomeTeam"].count()):
        home_team = table.loc[row_number, "HomeTeam"]
        away_team = table.loc[row_number, "AwayTeam"]
        if team in [home_team, away_team]:
            home_team_points = 0
            away_team_points = 0
            winner = table.loc[row_number, "FTR"]
            if winner == 'H':
                home_team_points = 3
            elif winner == 'A':
                away_team_points = 3
            else:
                home_team_points = 1
                away_team_points = 1
            if team == home_team:
                points += home_team_points
            else:
                points += away_team_points
    return points

def get_goals_scored_conceded(team, table):
    scored = 0
    conceded = 0
    for row_number in range(table["HomeTeam"].count()):
        home_team = table.loc[row_number, "HomeTeam"]
        away_team = table.loc[row_number, "AwayTeam"]
        if team in [home_team, away_team]:
            if team == home_team:
                scored += int(table.loc[row_number, "FTHG"])
                conceded += int(table.loc[row_number, "FTAG"])
            else:
                scored += int(table.loc[row_number, "FTAG"])
                conceded += int(table.loc[row_number, "FTHG"])
    return (scored, conceded)

def compute_table(df):
    raw_data = {"Team": [], "Points": [], "GoalDifference":[], "Goals": []}
    for team in set_of_teams:
        goal_data = get_goals_scored_conceded(team, df)
        raw_data["Team"].append(team)
        raw_data["Points"].append(calc_points(team, df))
        raw_data["GoalDifference"].append(goal_data[0] - goal_data[1])
        raw_data["Goals"].append(goal_data[0])
    data_frame = pandas.DataFrame(data=raw_data)
    data_frame = data_frame.sort_values(["Points", "GoalDifference", "Goals"], ascending=[False, False, False]).reset_index(drop=True)
    data_frame.index = numpy.arange(1,len(data_frame)+1)
    data_frame.index.names = ["Finish"]
    return data_frame

def get_finish(team, table):
    return table[table.Team==team].index.item()

def get_points(team, table):
    return table[table.Team==team].Points.item()

def display_hbar(tables):
    raw_data = {"Team": [], "Points": []}
    for row_number in range(tables["Team"].count()):
        raw_data["Team"].append(tables.loc[row_number+1, "Team"])
        raw_data["Points"].append(int(tables.loc[row_number+1, "Points"]))
    df = pandas.DataFrame(data=raw_data)
    #df = pandas.DataFrame(tables, columns=["Team", "Points"])
    print(df)
    print(df.dtypes)
    df["Points"].apply(int)
    print(df.dtypes)
    df.plot(kind='barh',x='Points',y='Team')

games = load_epl_games('epl2016.csv')
final_table = compute_table(games)
#print(final_table)
#print(get_finish("Tottenham", final_table))
#print(get_points("West Ham", final_table))
display_hbar(final_table)

输出:

              Team  Points
0          Chelsea      93
1        Tottenham      86
2         Man City      78
3        Liverpool      76
4          Arsenal      75
5       Man United      69
6          Everton      61
7      Southampton      46
8      Bournemouth      46
9        West Brom      45
10        West Ham      45
11       Leicester      44
12           Stoke      44
13  Crystal Palace      41
14         Swansea      41
15         Burnley      40
16         Watford      40
17            Hull      34
18   Middlesbrough      28
19      Sunderland      24
Team      object
Points     int64
dtype: object
Team      object
Points     int64
dtype: object
Traceback (most recent call last):
  File "C:/Users/Michael/Documents/Programming/Python/Premier League.py", line 99, in <module>
    display_hbar(final_table)
  File "C:/Users/Michael/Documents/Programming/Python/Premier League.py", line 92, in display_hbar
    df.plot(kind='barh',x='Points',y='Team')
  File "C:\Program Files (x86)\Python36-32\lib\site-    packages\pandas\plotting\_core.py", line 2941, in __call__
    sort_columns=sort_columns, **kwds)
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\pandas\plotting\_core.py", line 1977, in plot_frame
**kwds)
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\pandas\plotting\_core.py", line 1804, in _plot
    plot_obj.generate()
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\pandas\plotting\_core.py", line 258, in generate
    self._compute_plot_data()
  File "C:\Program Files (x86)\Python36-32\lib\site-packages\pandas\plotting\_core.py", line 373, in _compute_plot_data
'plot'.format(numeric_data.__class__.__name__))
TypeError: Empty 'DataFrame': no numeric data to plot
团队积分
0切尔西93
1托特纳姆86
2人城市78
3利物浦76
4阿森纳75
5人联队69人
6埃弗顿61
7南安普敦46
8伯恩茅斯46
9西布朗45
10西汉姆45
11莱斯特44
12斯托克44
13水晶宫41
14斯旺西41
15伯恩利40
16沃特福德40
17船体34
18米德尔斯堡28
19桑德兰24
团队对象
点int64
数据类型:对象
团队对象
点int64
数据类型:对象
回溯(最近一次呼叫最后一次):
文件“C:/Users/Michael/Documents/Programming/Python/Premier League.py”,第99行,在
显示hbar(最终表格)
文件“C:/Users/Michael/Documents/Programming/Python/Premier League.py”,第92行,在display\u hbar中
df.plot(kind='barh',x='Points',y='Team')
文件“C:\Program Files(x86)\Python36-32\lib\site-packages\pandas\plotting\\ u core.py”,第2941行,在调用中__
排序列=排序列,**kwds)
文件“C:\Program Files(x86)\Python36-32\lib\site packages\pandas\plotting\\ u core.py”,第1977行,在plot\ u框架中
**kwds)
文件“C:\Program Files(x86)\Python36-32\lib\site packages\pandas\plotting\\ u core.py”,第1804行,在\ u plot中
绘图对象生成()
文件“C:\Program Files(x86)\Python36-32\lib\site packages\pandas\plotting\\u core.py”,第258行,在generate中
self.\u compute\u plot\u data()
文件“C:\Program Files(x86)\Python36-32\lib\site packages\pandas\plotting\\u core.py”,第373行,在\u compute\u plot\u数据中
“绘图”。格式(数字数据、类别、名称)
TypeError:空的“DataFrame”:没有要打印的数字数据

我在显示栏功能中犯了什么错误,使我无法打印数据


这是您应该在
df.plot(…)
中交换
x
y
的。因为
y
必须是数字,这取决于熊猫


我很感激,我知道这是一个小小的+1,用于解释原因,而不仅仅是提供代码更正,并感谢文档。现在我只需要阅读更多的内容来弄清楚为什么df的顺序是正确的,但是条形图是颠倒的。
df.plot(x = "Team", y="Points", kind="barh");