【问题标题】:int not being properly recognized as an int from a csvint 未被正确识别为 csv 中的 int
【发布时间】:2020-11-05 17:41:20
【问题描述】:

Python 3.8 使用 Pandas,从 csv 文件中读取。下面的代码 sn-p 用于检测 projectID 列中的字段之一是否不是 int。问题是当有一个不是 int 的 projectID 时,错误消息会显示第一个 projectID 而不是导致问题的 ID,即使它本身是一个 int。

例如。 projectIDs 读取 ID [1, 3, 5]。它像冠军一样奔跑。没有错误。

例如。 projectIDs 读取 ID [1, 3, a5]。程序终止说“projectID 1 不是整数”。

我该如何纠正这个问题?

# load projects csv file
projectsFileData = pd.read_csv(projectsFile)

for i in projectsFileData['projectID']:
    if not type(i) == int:
        sys.exit("ERROR: projectID {0} is NOT an integer. Terminating Program.".format(i))

【问题讨论】:

  • 什么是“预期行为”?
  • 对于第二个示例,预期行为是 - 程序终止说“projectID a5 不是整数
  • 因为pandas 只会将整列读取为字符串。第一个项目 id 不是int (注意,实际上,pandas 在后台使用 numpy.dtypes,但遍历该列会将每个项目强制转换为原生 python 类型而不是numpy dtype) 你到底在问什么?正确什么
  • 如果将print(i) 语句放在if 之前会发生什么情况会很有帮助。
  • 刚刚试过了,迈克。有趣的结果:它在终止程序之前只打印出第一个值 1,即使 a5 是问题孩子。如果我确保所有值都是整数,它会将它们全部打印出来,没有任何错误。

标签: python python-3.x pandas csv


【解决方案1】:

尝试类型转换: 例如:

s = "10010"

# printing string converting to int base 2 
c = int(s,2) 
print ("After converting to integer base 2 : ", end="") 
print (c) 

# printing string converting to float 
e = float(s) 
print ("After converting to float : ", end="") 
print (e)

根据你的问题 int(i,10),10 是期望值的底数

projectsFileData = pd.read_csv(projectsFile)

for i in projectsFileData['projectID']:
if not type(int(i,10) == int:
    sys.exit("ERROR: projectID {0} is NOT an integer. Terminating Program.".format(i))

祝你好运!

【讨论】:

    【解决方案2】:

    您可以将projectID 列的数据类型设置为字符串:

    projectsFileData = projectsFileData['projectID'].astype(str)
    

    【讨论】:

      【解决方案3】:

      IIUC 我认为你想要这样的东西:

      import pandas as pd
      from io import StringIO
      
      def str_int_chooser(string):
          return int(string) if string.isnumeric() else string
      
      csv = """projectIDs, Name
      1, Project Runway
      2, Project Alpha
      3, Astronomical-Society
      4a, Necronomicon-con"""
      
      csv_file = StringIO(csv)
      
      df = pd.read_csv(csv_file, converters={"projectIDs": str_int_chooser})
      
      print(df)
      for i in df["projectIDs"]:
          print(i, type(i))
      

      输出:

        projectIDs                   Name
      0          1         Project Runway
      1          2          Project Alpha
      2          3   Astronomical-Society
      3         4a       Necronomicon-con
      1 <class 'int'>
      2 <class 'int'>
      3 <class 'int'>
      4a <class 'str'>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-28
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 2018-11-16
        • 1970-01-01
        • 2023-02-08
        • 1970-01-01
        相关资源
        最近更新 更多