【问题标题】:Python - Pandas library returns wrong column values after parsing a CSV filePython - Pandas 库在解析 CSV 文件后返回错误的列值
【发布时间】: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 示例,我无法重现该问题

标签: python pandas csv


【解决方案1】:

您可以按名称明智地选择列。只需使用以下行

values = parsed_csv[["Column Name","Column Name2"]]

或者你选择 Index wise by

cols = [1,2,3,4]
values = parsed_csv[parsed_csv.columns[cols]]

【讨论】:

  • 您好,感谢您的回答!这就是我从数组中获取列名的细微差别所做的事情。尝试像您一样对列名进行硬编码,但结果是相同的 - 获取错误的列值。然后尝试使用具有相同结果的整数索引。
  • 一定是编码问题
  • 我不确定。我认为可能是 read_csv 方法参数的一些错误配置...
猜你喜欢
  • 2022-11-03
  • 1970-01-01
  • 2021-08-05
  • 2016-03-12
  • 2020-11-19
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多