【问题标题】:Get datatype for a particular string part in python3获取python3中特定字符串部分的数据类型
【发布时间】:2018-11-05 16:25:31
【问题描述】:

我在 csv 文件中输入了 -0.02872239612042904、-0.19755002856254578.. 等 128 个值,当我从 csv 文件中读取该数组时,它被读取为“-0.02872239612042904、-0.19755002856254578..”我想出了一个办法将所有字符串映射到特定的数据类型。现在我正在这样做:-

result=list(map(float, re.findall(r'\d+', en)))  #en=string read from csv file

但是由于这些是面部编码,并且在计算距离时它始终返回 False,我认为这是因为在转换为字符串后,数组变得像 1906684972345829.0 等等。

我找不到一个数据类型来表示像 -0.02872239612042904 这样的数字,这就是为什么在映射时我要转换为浮点数,这是错误的格式。谁能告诉我python3中-0.02872239612042904等数字的正确数据类型是什么。非常感谢,现在让我头疼。

编辑:- 这就是我从 csv 文件中读取数据的方式:-

def get_encodings():
    df=pd.read_csv('Encodings/encodings.csv')       #getting file
    with tqdm(total=len(list(df.iterrows()))) as prbar:
        encodings=[]
        images=[]
        for index, row in df.iterrows():
            r=[]
            en=df.loc[index,'Encoding']
            print(en)   #prints correctly
            print(type(en))   #prints string and I want exact same data in its original form which looks like I have shown below

"[-0.19053705  0.06230173  0.04058716 -0.08283613 -0.07159504 -0.10155849
  0.06008045 -0.06842063  0.1317966  -0.10250588  0.203399   -0.01436609
 -0.21249449 -0.09238856  0.0279788   0.08926097 -0.09177385 -0.1628615
 -0.03505187 -0.12979373  0.05772705  0.00208503 -0.06933809  0.00741822
 -0.17499965 -0.25000119 -0.0205064  -0.03139503  0.01130889 -0.1057417
  0.13554846  0.06285821 -0.18908061 -0.02082938  0.04383367  0.23148835
 -0.05068404 -0.00925579  0.1900605  -0.05617992 -0.12842563 -0.06219928
  0.07317995  0.26369438  0.10394366  0.05749369  0.02448226 -0.07668396
  0.1266536  -0.23425353  0.04819498  0.07290804  0.111645    0.08294459
  0.10209186 -0.21581331  0.07399686  0.07748453 -0.22381224  0.01746997
  0.0188249  -0.06403829 -0.07789861 -0.0249712   0.21001905  0.03979192
 -0.12171203 -0.06864078  0.21658717 -0.17392246 -0.06753681  0.09808435
 -0.0076007  -0.18134885 -0.23990698  0.07026891  0.3552466   0.17010394
 -0.16684352  0.03726491  0.02757547  0.01445537  0.10094975  0.04033324
 -0.10441576  0.0377433  -0.09693146  0.04404883  0.16759454  0.0402087
 -0.05915016  0.1369293   0.05408669  0.05787617  0.03509152  0.01340439
 -0.06379045  0.04323686 -0.09738267 -0.02683797  0.14505677 -0.10747927
  0.03247242  0.11747092 -0.18656668  0.22448684 -0.00474619 -0.00586929
 -0.05853979  0.06613642 -0.065335    0.02921261  0.08723848 -0.30918318
  0.23265852  0.20364268 -0.07978678  0.19747412  0.08048097  0.04772019
  0.06427031 -0.03703914 -0.14493702 -0.12132056 -0.01301065 -0.02351468
  0.10600268  0.06480799]"

我的数据的一行看起来像这样^,我只想在这种类型中没有引号的所有数据 dtype('

【问题讨论】:

    标签: python python-3.x csv parsing floating-point


    【解决方案1】:

    如果您有 csv,请使用 csv 模块来读取它(或在 pandas 上阅读,它会自动将您的值转换为合适的类型):

    创建演示文件:

    data =  """-0.02872239612042904, -0.19755002856254578, 0.31345692434, -0.0009348573822
    -1.02872239612042904, -1.19755002856254578, 1.31345692434, -1.0009348573822
    -2.02872239612042904, -2.19755002856254578, 2.31345692434, -2.0009348573822
    -3.02872239612042904, -3.19755002856254578, 3.31345692434, -3.0009348573822
    apple, prank, 0.23, nothing
    """
    
    with open("datafile.csv","w") as f:
        f.write(data)
    

    读回演示文件

    def safeFloat(text):
        try:
            return float(text)
        except ValueError: # maybe even catchall here
            return float("nan")
    
    data = []    
    import csv
    with open("datafile.csv","r") as r:
        csv = csv.reader(r, delimiter=',')
        for l in csv:
            data.append(list(map(safeFloat,l))) # safeFloat to capture errors
    
    print(data)
    

    如果您的数据中有非浮点数,您可能希望在 map 内使用 def safeFloat(text) 而不是 float 以防止解析错误,某些文本无法转换为浮点数。

    输出:

    [[-0.02872239612042904, -0.19755002856254578, 0.31345692434, -0.0009348573822], 
     [-1.028722396120429, -1.1975500285625458, 1.31345692434, -1.0009348573822], 
     [-2.028722396120429, -2.1975500285625458, 2.31345692434, -2.0009348573822], 
     [-3.028722396120429, -3.1975500285625458, 3.31345692434, -3.0009348573822], 
     [nan, nan, 0.23, nan]]
    

    您也可以使用正则表达式,但您的模式需要允许可选符号以及它之前/之后的点和数字:

    r'[+-]?\d+\.\d+'  # would allow for 123.1245 - but not for 123 or .1234 
                      # would allow an optional +- before numbers
    

    您可以检查模式 f.e.在http://regex101.com - 这个带有演示数据的模式可以在这里找到:https://regex101.com/r/xSiyO1/1


    pandas 解决方案(仅有效数据):

    data =  """-0.02872239612042904, -0.19755002856254578, 0.31345692434, -0.0009348573822
    -1.02872239612042904, -1.19755002856254578, 1.31345692434, -1.0009348573822
    -2.02872239612042904, -2.19755002856254578, 2.31345692434, -2.0009348573822
    -3.02872239612042904, -3.19755002856254578, 3.31345692434, -3.0009348573822
    """
    
    with open("datafile.csv","w") as f:
        f.write(data)
    
    import pandas as pd
    import numpy as np
    
    df = pd.read_csv("datafile.csv", dtype={"a":np.float64,"b":np.float64,"c":np.float64,"d":np.float64},names=["a","b","c","d"] )
    print(df) 
    

    输出:

          a        b         c         d
    0 -0.028722 -0.19755  0.313457 -0.000935
    1 -1.028722 -1.19755  1.313457 -1.000935
    2 -2.028722 -2.19755  2.313457 -2.000935
    3 -3.028722 -3.19755  3.313457 -3.000935
    

    【讨论】:

    • @Asim this:pandas.pydata.org/pandas-docs/stable/generated/… 应该创建一个 pandas 数据框,其中所有类型转换都已完成 - 无需逐行进行。为其他读者添加了safeFloat()
    • @Asim 您已经检查过您看到的不仅仅是漂亮的打印变量内容,对吗? - 试试pd.options.display.float_format = '${:,.20f}'.format
    • @Asim Pandas 自动选择正确的数据类型 per column - 只要您在一列的任何字段中有 one 字符串,整列不能用float 表示——下一个是“str”然后是“object”(我认为)。请参阅change-data-type-of-columns-in-pandas - 您可能想要df.apply(pd.to_numeric, errors='coerce') - 在这种情况下,您将用 NaN 替换 str 。如果没有您提供数据框,则很难解决。使用您的真实数据编辑您的问题。
    • 我已经编辑了这个问题,现在请看一下。也非常感谢您尝试解决我的问题:)
    • @Asim - 打开另一个问题。您的数据根本不是 csv - 看起来好像有人将 numpy 数组的 __repr__ 打印到文件中。您可能需要对每一行使用 ast.literal_eval() 以从中重建列表 - 而不是将其解析为 csv。见docs.python.org/3/library/ast.html#ast.literal_eval - 你可以给它一个字符串并得到一个返回的pythin obj,f.e. k = ast.literal_eval("[1,2,3,4,5]") 将使 k 成为整数 1 到 5 的 python 列表 - 而且您在列表元素之间缺少 , - 所以它可能是某种 numpy 输出?
    猜你喜欢
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多