熊猫阅读科学数据

时间:2019-06-23 12:22:12

标签: python python-3.x pandas

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

的内容
"4.2515014131285567e-001"

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

例如*2给我:

"4.2515014131285567e-0014.2515014131285567e-001"

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

我试图设置"dtype=str" "dtype=float"之类的东西,但无济于事。

2 个答案:

答案 0 :(得分:0)

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

test.txt中的初始数据集:

try {
   mvxImage.ImageUrl = "someimage_url"
} catch (Exception e) {
   mvxImage.ImageUrl = "somedefault_url";
}

这将测试是否为float,如果是,则在创建要跳过的值列表时返回true / false。

Math
4.2515014131285567e-001
asdas
123123
asdasd124
123
125423414asd

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

最终的数据帧看起来像预期的那样(请注意有0,因为我尚未设置格式。

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)

答案 1 :(得分:0)

尝试以下测试:

使用 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()检查列的类型。 对于 c2 c3 列,您都应该收到 float64 类型。

如果执行df.c2 * 2,则应该收到加倍的值。 不要为小数位数而烦恼。 这是 Pandas 选项的问题。

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

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

到目前为止,还可以,但是现在尝试第二项测试:

在第3行的 c2 列中,删除 -001 前面的 e ,因此该值现在为 再次 4.2515014131282222-001 read_csv

更改的值是不是任何格式正确的 float ,因此 read_csv 假定 c2 object 类型,实际上是 string (您可以确认 df.info())。

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

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

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

(用正确的列名称替换 c2 ),然后在此列中查找 对于 NaN 值。

然后查看输入文件中的相应行并更正错误。

替代方法:df.dropna(inplace=True)删除包含以下内容的每一行containig NaN 柱。您还可以添加 subset = ['column_name'] 参数来删除行 与 NaN 仅在这一栏中。