【发布时间】:2019-01-14 08:50:36
【问题描述】:
- 已解决自己找到了解决方案。事实证明,当您想按名称检索特定列时,您应该按照它们在 csv 中出现的顺序传递名称(这对于旨在为开发人员 IMO 节省一些解析时间的库来说真的很愚蠢)。如果我错了,请纠正我,但如果列的顺序不同,我看不到按名称获取特定列值的 on 选项...
我正在尝试使用 python 读取逗号分隔值文件,然后 使用 Pandas 库解析它。由于该文件有许多不需要的值(列),我列出了我确实需要的列名。
Here's a look at the csv file format.
Div,Date,HomeTeam,AwayTeam,FTHG,FTAG,FTR,HTHG,HTAG,HTR,出勤率,裁判,HS,AS,HST,AST,HHW,AHW,HC,AC,HF,AF,HO,AO ,HY,AY,HR,AR,HBP,ABP,GBH,GBD,GBA,IWH,IWD,IWA,LBH,LBD,LBA,SBH,SBD,SBA,WHH,WHD,WHA E0,19/08/00,查尔顿,曼城,4,0,H,2,0,H,20043,Rob 哈里斯,17,8,14,4,2,1,6,6,13,12,8,6,1,2,0,0,10,20,2,3,3.2,2.2,2.9,2.7, 2.2,3.25,2.75,2.2,3.25,2.88,2.1,3.2,3.1 E0,19/08/00,切尔西,西汉姆,4,2,H,1,0,H,34914,格雷厄姆 理发师,17,12,10,5,1,0,7,7,19,14,2,3,1,2,0,0,10,20,1.47,3.4,5.2,1.6,3.2,4.2, 1.5,3.4,6,1.5,3.6,6,1.44,3.6,6.5 E0,19/08/00,考文垂,米德尔斯堡,1,3,A,1,1,D,20624,巴里 骑士,6,16,3,9,0,1,8,4,15,21,1,3,5,3,1,0,75,30,2.15,3,3,2.2,2.9,2.7, 2.25,3.2,2.75,2.3,3.2,2.75,2.3,3.2,2.62 E0,19/08/00,德比,南安普顿,2,2,D,1,2,A,27223,安迪 D'Urso,6,13,4,6,0,0,5,8,11,13,0,2,1,1,0,0,10,10,2,3.1,3.2,1.8,3, 3.5,2.2,3.25,2.75,2.05,3.2,3.2,2,3.2,3.2 E0,19/08/00,利兹,埃弗顿,2,0,H,2,0,H,40010,德莫特 加拉格尔,17,12,8,6,0,0,6,4,21,20,6,1,1,3,0,0,10,30,1.65,3.3,4.3,1.55,3.3,4.5, 1.55,3.5,5,1.57,3.6,5,1.61,3.5,4.5 E0,19/08/00,莱斯特,阿斯顿维拉,0,0,D,0,0,D,21455,迈克 莱利,5,5,4,3,0,0,5,4,12,12,1,4,2,3,0,0,20,30,2.15,3.1,2.9,2.3,2.9,2.5, 2.35,3.2,2.6,2.25,3.25,2.75,2.4,3.25,2.5 E0,19/08/00,利物浦,布拉德福德,1,0,H,0,0,D,44183,保罗 杜尔金,16,3,10,2,0,0,6,1,8,8,5,0,1,1,0,0,10,10,1.25,4.1,7.2,1.25,4.3,8, 1.35,4,8,1.36,4,8,1.33,4,8
这个列表被传递给 pandas.read_csv() 的 names 参数。 See code.
# Returns an array of the column names needed for our raw data table
def cols_to_extract():
cols_to_use = [None] * RawDataCols.COUNT
cols_to_use[RawDataCols.DATE] = 'Date'
cols_to_use[RawDataCols.HOME_TEAM] = 'HomeTeam'
cols_to_use[RawDataCols.AWAY_TEAM] = 'AwayTeam'
cols_to_use[RawDataCols.FTHG] = 'FTHG'
cols_to_use[RawDataCols.HG] = 'HG'
cols_to_use[RawDataCols.FTAG] = 'FTAG'
cols_to_use[RawDataCols.AG] = 'AG'
cols_to_use[RawDataCols.FTR] = 'FTR'
cols_to_use[RawDataCols.RES] = 'Res'
cols_to_use[RawDataCols.HTHG] = 'HTHG'
cols_to_use[RawDataCols.HTAG] = 'HTAG'
cols_to_use[RawDataCols.HTR] = 'HTR'
cols_to_use[RawDataCols.ATTENDANCE] = 'Attendance'
cols_to_use[RawDataCols.HS] = 'HS'
cols_to_use[RawDataCols.AS] = 'AS'
cols_to_use[RawDataCols.HST] = 'HST'
cols_to_use[RawDataCols.AST] = 'AST'
cols_to_use[RawDataCols.HHW] = 'HHW'
cols_to_use[RawDataCols.AHW] = 'AHW'
cols_to_use[RawDataCols.HC] = 'HC'
cols_to_use[RawDataCols.AC] = 'AC'
cols_to_use[RawDataCols.HF] = 'HF'
cols_to_use[RawDataCols.AF] = 'AF'
cols_to_use[RawDataCols.HFKC] = 'HFKC'
cols_to_use[RawDataCols.AFKC] = 'AFKC'
cols_to_use[RawDataCols.HO] = 'HO'
cols_to_use[RawDataCols.AO] = 'AO'
cols_to_use[RawDataCols.HY] = 'HY'
cols_to_use[RawDataCols.AY] = 'AY'
cols_to_use[RawDataCols.HR] = 'HR'
cols_to_use[RawDataCols.AR] = 'AR'
return cols_to_use
# Extracts raw data from the raw data csv and populates the raw match data table in the database
def extract_raw_data(csv):
# Clear the database table if it has any logs
# if MatchRawData.objects.count != 0:
# MatchRawData.objects.delete()
cols_to_use = cols_to_extract()
# Read and parse the csv file
parsed_csv = pd.read_csv(csv, delimiter=',', names=cols_to_use, header=0)
for col in cols_to_use:
values = parsed_csv[col].values
for val in values:
print(str(col) + ' --------> ' + str(val))
RawDataCols 是一个 IntEnum。
class RawDataCols(IntEnum):
DATE = 0
HOME_TEAM = 1
AWAY_TEAM = 2
FTHG = 3
HG = 4
FTAG = 5
AG = 6
FTR = 7
RES = 8
...
使用它获取列名。那部分代码工作正常。获得了正确的列名,但在尝试使用
获取其值之后 values = parsed_csv[col].values
pandas 返回错误列的值。错误的列索引与我要获取的索引相距大约 13 个索引。我错过了什么?
【问题讨论】:
-
能否请您发布数据和代码示例,我无法访问链接。建议不要在问题中发布图片。
-
@anky_91 确定!但这不是图像。它是一个指向 pastebin 的链接,这是一个文本存储站点,用户可以在其中存储可以根据编程语言突出显示的纯文本。将编辑我的帖子
-
对不起,我的意思是链接。 :)
-
问题已被编辑。谢谢
-
请查看如何创建reproducible 示例,我无法重现该问题