我有一个csv文件,其中许多列包含类似
的内容"4.2515014131285567e-001"
Pandas将其作为对象读取,因此计算没有意义。
例如*2
给我:
"4.2515014131285567e-0014.2515014131285567e-001"
如何将其用作数字并进行一些数学运算?
我试图设置"dtype=str" "dtype=float"
之类的东西,但无济于事。
答案 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 仅在这一栏中。