【问题标题】:Pandas reading scientific data熊猫阅读科学数据
【发布时间】:2019-11-05 12:11:35
【问题描述】:

我有一个包含许多列的 csv 文件,其中包含类似

的内容
"4.2515014131285567e-001"

Pandas 将其读取为 object,因此计算没有意义。

例如*2给我:

"4.2515014131285567e-0014.2515014131285567e-001"

如何将其用作数字并做一些数学运算?

我尝试设置"dtype=str" "dtype=float" 之类的东西,但没有任何效果。

【问题讨论】:

  • 看起来有点类似:stackoverflow.com/q/17737300/4636715
  • 如果您只有列的值与您的示例类似。试试df = df.astype(float) 然后试试你的计算方法
  • 谢谢,我遇到了一个问题:表中有一些字符串,我想删除它。这一行以字符串“info”开头,我想删除这一行和下面的每一行。我怎样才能做到这一点?从顶部我可以使用“skiprows”,我该如何从底部执行此操作?以及如何跳过特定列?
  • 好的,我找到了删除行的解决方案。现在 df.astype(float) 工作:-)

标签: python python-3.x pandas


【解决方案1】:

尝试以下测试:

使用 read_csv 创建以下 DataFrame,但来自文本缓冲区:

txt = '''c1,c2,c3
Xxxxx,4.2515014131285567e-001,4.2515014131285555e-001
Yyyyy,4.2515014131284444e-001,4.2515014131283333e-001
Zzzzz,4.2515014131282222e-001,4.2515014131281111e-001'''
df = pd.read_csv(pd.compat.StringIO(txt))

然后使用df.info() 检查列的类型。 对于 c2c3 列,您应该收到 float64 类型。

如果您执行df.c2 * 2,您应该会收到双倍的值。 不要为较小的十进制数字而烦恼。 这是 Pandas 选项的问题。

您可以使用df.loc[0, 'c2'] 以几乎完全的精度显示单个数字 (我得到了0.4251501413128557)。

即使数字被例如包围也应该是相同的结果双引号。

到目前为止一切正常,但现在尝试第二次测试:

在第3行,c2列,去掉-001前面的e,所以现在这个值 4.2515014131282222-001read_csv 再次。

改变的值不是任何格式正确的float,所以read_csv 假设 c2object 类型,实际上是一个 string (你可以确认它 与df.info())。

我的假设是在您的文本文件中某处的数字格式 以某种方式“损坏”,这会阻止 read_csv 读取 此列为 float

要查找此错误的位置 - 来源,请运行:

df.c2 = pd.to_numeric(df.c2, errors='coerce')

(将 c2 替换为正确的列名)然后查看此列 NaN 值。

然后查看输入文件中对应的行,纠正错误。

替代方案:df.dropna(inplace=True) 删除任何包含 NaN 的每一行 柱子。您还可以添加 subset=['column_name'] 参数,以删除行 NaN 仅在这一列中。

【讨论】:

    【解决方案2】:

    通过一些预处理,您可以在导入时转换数据并在导入之前删除非浮动记录(如果存在)。

    test.txt 中的初始数据集:

    Math
    4.2515014131285567e-001
    asdas
    123123
    asdasd124
    123
    125423414asd
    

    这会测试是否浮动,如果是,它将在创建要跳过的值列表时返回真/假。

    def isFloat(val):
    
        try:
            float(val)
            return True
    
        except:
            return False
    
    with open('test.txt','r') as f:
    
        skiplines=[]
    
        for i, v in enumerate(f.readlines()):
    
            if not isFloat(v.split(',')[0]):
    
                skiplines.append(i)
    
    # we want to maintain the column header.
        del skiplines[0]
    
    
    
    converter = {'NumberColName':lambda x: float(x)}
    
    df = pd.read_csv('test.txt', converters = converter, skiprows= skiplines)
    

    lambda 函数也可以只是声明一个数据类型。我喜欢演示转换器,因为如果需要,您可以在此处轻松舍入或应用逻辑。

    最终的数据框看起来符合预期(注意有 0,因为我还没有设置格式。

    print(df)
               Math
    0       0.42515
    1  123123.00000
    2     123.00000
    

    【讨论】:

      猜你喜欢
      • 2016-03-04
      • 2013-07-18
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      • 2012-05-16
      相关资源
      最近更新 更多