背景:
用python读取excel中的数据,生成insert into sql。发现打印出来的sql中存在nan。使用
df = df.where(pd.notna(df), None) 对DF转换,以及[None if item == 'nan' else item for item in ordered_values] 对遍历出的列表进行转换均无法转换。
核心代码:
# 将 NaN 值替换为 None
df = df.where(pd.notna(df), None)
df = df.applymap(lambda x: x if pd.notna(x) else None)
ordered_values_new = [None if item == 'nan' else item for item in ordered_values]
发现处理后仍有nan。
打印数据类型
for item in ordered_values_new:
print(f'Item: {item}, Type: {type(item)}')
##打印结果
Item: nan, Type: float
发现数据类型为 float,无法转换
解决方式1:
我们可以使用 try-except
块来安全地尝试将元素转换为浮点数,并在转换失败时保留原始值。
import math
ordered_values = ['1', '2', 'nan', '4', float('nan'), 'hello', 5]
# 使用 try-except 块来安全地尝试将元素转换为浮点数
ordered_values_new = []
for item in ordered_values:
try:
# 尝试将元素转换为浮点数并检查是否为 NaN
if math.isnan(float(item)):
ordered_values_new.append(None)
else:
ordered_values_new.append(item)
except ValueError:
# 如果转换失败,保留原始值
ordered_values_new.append(item)
for item in ordered_values_new:
print(f'Item: {item}, Type: {type(item)}')
在这个方案中,我们使用 try-except
块来尝试将每个元素转换为浮点数。如果转换成功并且结果是 NaN
,则将其替换为 None
。如果转换失败(例如,对于非数字字符串或非浮点数的其他类型),则保留原始值。
解决方式2:
import pandas as pd
ordered_values = ['1', '2', 'nan', '4', float('nan'), 'hello', 5, None, pd.NA]
# 使用 pd.isna() 来检测多种形式的缺失值
ordered_values_new = [None if pd.isna(item) else item for item in ordered_values]
for item in ordered_values_new:
print(f'Item: {item}, Type: {type(item)}')
在这个方案中,pd.isna()
函数会检测多种形式的缺失值,包括 NaN
、None
以及 pd.NA
,并将它们替换为 None
。这种方式更为通用和温和,因为它不需要显式地进行类型转换,也不会抛出异常。
解决方式3:
我们可以编写一个函数来检测多种形式的缺失值,包括 NaN
、None
以及字符串 'nan'
import math
def is_missing(value):
if value is None:
return True
elif isinstance(value, str) and value.lower() == 'nan':
return True
elif isinstance(value, float) and math.isnan(value):
return True
return False
ordered_values = ['1', '2', 'nan', '4', float('nan'), 'hello', 5, None]
# 使用自定义的 is_missing 函数来检测多种形式的缺失值
ordered_values_new = [None if is_missing(item) else item for item in ordered_values]
for item in ordered_values_new:
print(f'Item: {item}, Type: {type(item)}')
我们定义了一个 is_missing
函数,用于检测多种形式的缺失值。该函数会检查以下几种情况:
-
值是否为
None
。 -
值是否为字符串
'nan'
(不区分大小写)。 -
值是否为浮点数
NaN
。
然后,我们使用这个函数在列表推导式中检测并替换缺失值。
备注:只做临时记录,另外的文章展示完整的代码:python读取excel,转换为JSON/INSERT SQL语句-CSDN博客