我有一个带有体育数据的excel电子表格--一个标题行,上面有团队、结果、日期等内容,还有其中所有球队的行(例如,如果是棒球,前162排是一个队的单项比赛,那么下一个162排是另一个队的比赛,等等)。
我可以用XLRD轻松地将它们读入python,但我不知道如何准确地存储它们,这样我就可以轻松地访问有关特定团队的信息。我可以使用defaultdict(列表),但老实说,我并不太确定如何实际访问任何特定的内容。
例如:
import xlrd
import xlwt
import os.path
import math
import pandas as pd
from xlutils.copy import copy as xl_copy
from collections import defaultdict
result = defaultdict(list)
workbook = xlrd.open_workbook("Sample.xls")
worksheet = workbook.sheet_by_index(1)
headers = worksheet.row(0)
for index in range(worksheet.nrows)[1:]:
for header, col in zip(headers, worksheet.row(index)):
result[header.value].append(col.value)这会将我需要的所有内容存储在“结果”中,输出(如果我打印的话)是这样的(例如,一个3行文件):
Team {'Boston Red Sox','Boston Red Sox','Boston Red Sox'}
Score {'11-4','4-0','5-6'}
Result {'W','W','L'}如何通过team更好地存储/排序这些信息,以便我能够轻松地访问与特定团队有关的信息?**如果我想将他们取得的胜利相加起来,例如,我将如何做到这一点?耳聋对这种情况有什么好处吗?
谢谢
发布于 2018-01-31 23:42:10
假设您有以下数据:

您可能希望将数据存储为list of dictionaries,如下所示:
data = [{'Team':'Miami Heat', 'Score':'11:4', 'Result':'W'},
{'Team':'Golden State Warriors', 'Score':'4:0', 'Result':'W'},
{'Team':'Cleveland Cavaliers', 'Score':'5:6', 'Result':'L'}]您可以通过以下代码来实现这一点:
import xlrd
workbook = xlrd.open_workbook('Sample.xls')
worksheet = workbook.sheet_by_index(0)
result = []
keys = [v.value.encode('ascii', 'ignore') for v in worksheet.row(0)]
for row_number in range(worksheet.nrows)[1:]:
row_data = {}
for col_number, cell in enumerate(worksheet.row(row_number)):
row_data[keys[col_number]] = cell.value.encode('ascii', 'ignore')
result.append(row_data)然后,您可以轻松地对字典数组执行操作,比如按团队排序--例如使用以下代码:
sorted_team = sorted(result, key=lambda k: k['Team'])假设您想浏览每本词典并获得特定团队的分数(例如“迈阿密热火”和"11-4"),那么您可以这样做:
for item in result:
if item['Team'] == "Miami Heat":
print item['Score']这是一条很长的路。我非常肯定,您可以使用generator expressions或其他一些方法简化这段代码,让您了解一下。:)
我对这段代码的变量名做了一些调整,以使它们更具描述性。
发布于 2018-02-01 06:57:31
使用熊猫的read_excel方法。
这会将Excel数据放入与Excel表具有相同结构的整洁的dataframe中。
import pandas as pd
df = pd.read_excel("Sample.xls")如果有日期时间列,请使用选项parse_dates=[datetime_column]。
然后检查您的数据是否具有使用df.dtypes的所有正确的数据类型,如果需要更改某些数据,则使用df[column] = df[column].astype(new_data_type)。
若要按团队对数据进行排序,请执行以下操作:
df = df.sort_values("Team").reset_index(drop=True)要从某个团队中选择数据,请使用布尔索引:
df_team = df[df["Team"] == team]如果您想要操作经过过滤的数据,请在上面的代码后面进一步放置一个.copy(),以创建一个新的对象。
要打印该团队的得分,您可以这样做:
print(df_team["Score"])如果结果很长--这将省略数据,那么您可以这样做:
with pd.option_context('display.max_rows', None):
print(df_team["Score"])另一种方法是迭代行,但不建议这样做:
for _,row in df_team.iterrows():
print(row["Score"])https://stackoverflow.com/questions/48552061
复制相似问题