df['Discount_rate'] = df['Discount_rate'].apply(str).apply(lambda x: float(x) if '.' in x else int(str(x)))报错invalid literal for int() with base 10: 'Discount_rate'
这个错误提示看起来是因为你的数据中存在一些异常值,导致无法转换成浮点数或整数。
你可以尝试在转换前,先查看下该列中的数据是否全部符合要求。可以使用value_counts()
方法查看该列中的不同取值。
另外,你也可以尝试将转换函数拆分成两部分,先将字符串转换成浮点数,再用math.isnan()
判断是否为非数字类型,如果是,则将其转换成整数。
例如:
import math
def convert_discount_rate(x):
x = float(x)
if math.isnan(x):
return -1
elif '.' in str(x):
return x
else:
return int(x)
df['Discount_rate'] = df['Discount_rate'].apply(str).apply(convert_discount_rate)
这样处理后,如果有非数字类型的数据,会被转换成-1,便于后续处理。
data = dataset.copy() # 折扣率处理 is_manjian = data['Discount_rate'].str.contains(':').astype(int) discount_rate = data['Discount_rate'].apply(lambda x: float(x) if ':' not in str(x) else (float(str(x).split(':')[0]) - float(str(x).split(':')[1])) / float(str(x).split(':')[0])) min_cost_of_manjian = data['Discount_rate'].apply(lambda x: -1 if ':' not in str(x) else int(str(x).split(':')[0])) data['is_manjian'] = is_manjian data['discount_rate'] = discount_rate data['min_cost_of_manjian'] = min_cost_of_manjian # 距离处理 data['Distance'].fillna(-1, inplace=True) null_distance = (data['Distance'] == -1).astype(int) data['null_distance'] = null_distance # 时间处理 data['date_received'] = pd.to_datetime(data['Date_received'], format='%Y%m%d') if 'Date' in data.columns.tolist(): data['date'] = pd.to_datetime(data['Date'], format='%Y%m%d') return data出现cannot convert float NaN to integer的报错怎么解决
出现 cannot convert float NaN to integer
的报错是因为在 null_distance
的计算中,data['Distance']
中存在缺失值 NaN
,无法将其转换为整数类型。可以尝试将 null_distance
的计算改为:
null_distance = (data['Distance'].fillna(-1) == -1).astype(int)
这样可以先将 NaN
值填充为 -1,再进行计算,避免了无法转换类型的问题。
def pre(dataset): ''''数据预处理''' # 源数据 data = dataset.copy() # 对折扣率进行处理 data['is_manjian'] = data['Discount_rate'].apply(lambda x: 1 if ":" in str(x) else 0) # Discount_rate是否为满减 data['discount_rate'] = data['Discount_rate'].apply(lambda x: float(x) if ":" not in str(x) else (float(str(x).split(':')[0]) - float(str(x).split(':')[1])) / float(str(x).split(':')[0])) # 满减全部转换为折扣率 data['min_cost_of_manjian'] = data['Discount_rate'].apply(lambda x: -1 if ":" not in str(x) else int(str(x).split(':')[0])) # 满减的最低消费 # 对距离进行处理 data['Distance'].fillna(-1, inplace=True) # 空距离填充为-1 data['null_distance'] = data['Distance'].apply(lambda x: 1 if x == -1 else 0) #对日期进行处理 data['date_received'] = pd.to_datetime(data['Date_received'], format='%Y%m%d') if 'Date' in data.columns.tolist(): data['date'] = pd.to_datetime(data['Date'], format='%Y%m%d') # 打标 #领取优惠券后15天内使用的样本标签为1,否则为0 data['label'] = list(map(lambda x, y: 1 if (x - y).total_seconds() / (60 * 60 * 24) <= 15 else 0, data['date'],data['date_received'])) return data请重构代码,降低查重率
def preprocess_data(dataset): data = dataset.copy() data['is_manjian'] = data['Discount_rate'].apply(lambda x: 1 if ":" in str(x) else 0) data['discount_rate'] = data['Discount_rate'].apply(lambda x: (float(str(x).split(':')[0]) - float(str(x).split(':')[1])) / float(str(x).split(':')[0]) if ":" in str(x) else float(x)) data['min_cost_of_manjian'] = data['Discount_rate'].apply(lambda x: int(str(x).split(':')[0]) if ":" in str(x) else -1) data['Distance'].fillna(-1, inplace=True) data['null_distance'] = data['Distance'].apply(lambda x: 1 if x == -1 else 0) data['date_received'] = pd.to_datetime(data['Date_received'], format='%Y%m%d') if 'Date' in data.columns.tolist(): data['date'] = pd.to_datetime(data['Date'], format='%Y%m%d') data['label'] = ((data['date'] - data['date_received']).dt.days <= 15).astype(int) return data
相关推荐















