pd.read_feather 小数/千位分隔符问题和浮点数舍入问题
pd.read_feather problems with decimal / thousands separator and rounding problems for floats
我想使用 .ftr 文件快速分析数百个表。不幸的是,我在小数点和千位分隔符方面有一些问题,类似于 ,只是 read_feather 不允许 decimal=',', thousands='.'
选项。我尝试了以下方法:
df['numberofx'] = (
df['numberofx']
.apply(lambda x: x.str.replace(".","", regex=True)
.str.replace(",",".", regex=True))
导致
AttributeError: 'str' object has no attribute 'str'
当我把它改成
df['numberofx'] = (
df['numberofx']
.apply(lambda x: x.replace(".","").replace(",","."))
我在结果中收到一些奇怪的(四舍五入)错误,例如对于某些大于 1k 的数字,22359999999999998 而不是 2236。 1k以下都是真实结果的10倍,估计是去掉了“.”的缘故。浮点数并创建该数字的整数。
正在尝试
df['numberofx'] = df['numberofx'].str.replace('.', '', regex=True)
也会导致结果中出现一些奇怪的行为,因为一些数字在 10^12 范围内,而其他数字则保持在 10^3 范围内。
。我知道我可以简单地从 Excel 文件创建数据帧,但这会大大降低我的日常计算速度。
我该如何解决这个问题?
EDIT:问题似乎来自于将 excel 文件读入为 df 且使用非美国标准的小数点和千位分隔符,而不是将其保存为羽毛。使用 pd.read_excel(f, encoding='utf-8', decimal=',', thousands='.')
选项读取 excel 文件解决了我的问题。这就引出了下一个问题:
为什么在羽毛文件中保存浮点数会导致奇怪的舍入错误,例如将 2.236 更改为 2.2359999999999998?
您的代码中的问题是:
当您检查数据框 (Panda) 中的列类型时,您会发现:
df.dtypes['numberofx']
结果:类型 object
所以建议的解决方案是尝试:
df['numberofx'] = df['numberofx'].apply(pd.to_numeric, errors='coerce')
解决此问题的另一种方法是将您的值转换为浮点数:
def coerce_to_float(val):
try:
return float(val)
except ValueError:
return val
df['numberofx']= df['numberofx'].applymap(lambda x: coerce_to_float(x))
为了避免这种类型的浮点数 '4.806105e+12' 这里是一个示例
样本:
df = pd.DataFrame({'numberofx':['4806105017087','4806105017087','CN414149']})
print (df)
ID
0 4806105017087
1 4806105017087
2 CN414149
print (pd.to_numeric(df['numberofx'], errors='coerce'))
0 4.806105e+12
1 4.806105e+12
2 NaN
Name: ID, dtype: float64
df['numberofx'] = pd.to_numeric(df['numberofx'], errors='coerce').fillna(0).astype(np.int64)
print (df['numberofx'])
ID
0 4806105017087
1 4806105017087
2 0
正如我在此处编辑中提到的那样,解决了我最初的问题:
path = r"pathname\*_somename*.xlsx"
file_list = glob.glob(path)
for f in file_list:
df = pd.read_excel(f, encoding='utf-8', decimal=',', thousands='.')
for col in df.columns:
w= (df[[col]].applymap(type) != df[[col]].iloc[0].apply(type)).any(axis=1)
if len(df[w]) > 0:
df[col] = df[col].astype(str)
if df[col].dtype == list:
df[col] = df[col].astype(str)
pathname = f[:-4] + "ftr"
df.to_feather(pathname)
df.head()
我必须添加 decimal=',', thousands='.'
选项来读取 excel 文件,我后来将其保存为 feather。因此,在使用 .ftr 文件时不会出现问题,而是在之前。舍入问题似乎来自将具有不同小数点和千位分隔符的数字保存为 .ftr 文件。
我想使用 .ftr 文件快速分析数百个表。不幸的是,我在小数点和千位分隔符方面有一些问题,类似于 decimal=',', thousands='.'
选项。我尝试了以下方法:
df['numberofx'] = (
df['numberofx']
.apply(lambda x: x.str.replace(".","", regex=True)
.str.replace(",",".", regex=True))
导致
AttributeError: 'str' object has no attribute 'str'
当我把它改成
df['numberofx'] = (
df['numberofx']
.apply(lambda x: x.replace(".","").replace(",","."))
我在结果中收到一些奇怪的(四舍五入)错误,例如对于某些大于 1k 的数字,22359999999999998 而不是 2236。 1k以下都是真实结果的10倍,估计是去掉了“.”的缘故。浮点数并创建该数字的整数。
正在尝试
df['numberofx'] = df['numberofx'].str.replace('.', '', regex=True)
也会导致结果中出现一些奇怪的行为,因为一些数字在 10^12 范围内,而其他数字则保持在 10^3 范围内。
我该如何解决这个问题?
EDIT:问题似乎来自于将 excel 文件读入为 df 且使用非美国标准的小数点和千位分隔符,而不是将其保存为羽毛。使用 pd.read_excel(f, encoding='utf-8', decimal=',', thousands='.')
选项读取 excel 文件解决了我的问题。这就引出了下一个问题:
为什么在羽毛文件中保存浮点数会导致奇怪的舍入错误,例如将 2.236 更改为 2.2359999999999998?
您的代码中的问题是:
当您检查数据框 (Panda) 中的列类型时,您会发现:
df.dtypes['numberofx']
结果:类型 object
所以建议的解决方案是尝试:
df['numberofx'] = df['numberofx'].apply(pd.to_numeric, errors='coerce')
解决此问题的另一种方法是将您的值转换为浮点数:
def coerce_to_float(val):
try:
return float(val)
except ValueError:
return val
df['numberofx']= df['numberofx'].applymap(lambda x: coerce_to_float(x))
为了避免这种类型的浮点数 '4.806105e+12' 这里是一个示例 样本:
df = pd.DataFrame({'numberofx':['4806105017087','4806105017087','CN414149']})
print (df)
ID
0 4806105017087
1 4806105017087
2 CN414149
print (pd.to_numeric(df['numberofx'], errors='coerce'))
0 4.806105e+12
1 4.806105e+12
2 NaN
Name: ID, dtype: float64
df['numberofx'] = pd.to_numeric(df['numberofx'], errors='coerce').fillna(0).astype(np.int64)
print (df['numberofx'])
ID
0 4806105017087
1 4806105017087
2 0
正如我在此处编辑中提到的那样,解决了我最初的问题:
path = r"pathname\*_somename*.xlsx"
file_list = glob.glob(path)
for f in file_list:
df = pd.read_excel(f, encoding='utf-8', decimal=',', thousands='.')
for col in df.columns:
w= (df[[col]].applymap(type) != df[[col]].iloc[0].apply(type)).any(axis=1)
if len(df[w]) > 0:
df[col] = df[col].astype(str)
if df[col].dtype == list:
df[col] = df[col].astype(str)
pathname = f[:-4] + "ftr"
df.to_feather(pathname)
df.head()
我必须添加 decimal=',', thousands='.'
选项来读取 excel 文件,我后来将其保存为 feather。因此,在使用 .ftr 文件时不会出现问题,而是在之前。舍入问题似乎来自将具有不同小数点和千位分隔符的数字保存为 .ftr 文件。