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的报错怎么解决
时间: 2024-03-13 11:44:49 浏览: 19
出现 `cannot convert float NaN to integer` 的报错是因为在 `null_distance` 的计算中,`data['Distance']` 中存在缺失值 `NaN`,无法将其转换为整数类型。可以尝试将 `null_distance` 的计算改为:
```python
null_distance = (data['Distance'].fillna(-1) == -1).astype(int)
```
这样可以先将 `NaN` 值填充为 -1,再进行计算,避免了无法转换类型的问题。
相关问题
源数据 data = dataset.copy() # 折扣率处理 data['is_manjian'] = data['Discount_rate'].map(lambda x: 1 if ':' in str(x) else 0) # Discount_rate是否为满减 data['discount_rate'] = data['Discount_rate'].map(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'].map( 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'].map(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(): # off_train data['date'] = pd.to_datetime(data['Date'], format='%Y%m%d') # 返回 return data将以上代码改写并优化而功能不变
可以将以上代码改写如下:
```
def process_data(dataset):
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
```
主要优化点如下:
1. 使用了 apply 函数代替了 map 函数,因为 apply 函数可以返回Series而不是单个值,更加灵活。
2. 使用了 str.contains 函数代替了 map 函数中的字符串判断,因为 str.contains 更加简洁易读。
3. 使用了 .astype(int) 代替了 lambda 函数中的 if else 语句,因为 .astype(int) 更加高效。
4. 将同一操作的代码写在一起,更加清晰易懂。
优化这段代码class dataset(Dataset.Dataset): def __init__(self, Data, transform=None): self.Data = Data self.transform = transform def __len__(self): return len(self.Data) def __getitem__(self, idx): data = self.Data[idx] img_transformed = self.transform(data) return img_transformed
A:这段代码的性能已经不错,但有一些小的优化可能会提高其效率:
1. 使用torchvision.transforms.Compose()将所有变换组合,以避免在每个样本中重复调用Transform;
2. 在获取项目时,将数据转换为Tensor,而不是在每个Transform中进行转换。这将减少在每个Transform上进行的操作;
3. 尝试缓存已转换的数据,以避免重复调用Transform。
修改后的代码示例:
```
from torchvision import transforms
class CustomDataset(Dataset):
def __init__(self, data, transform=None):
self.data = data
self.transform = transform
# 将所有变换组合为一个Compose Transforms
if transform is not None:
self.transform = transforms.Compose(transform)
else:
self.transform = transforms.Compose([transforms.ToTensor()])
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
# 缓存已转换的数据 (optional)
if idx in self.cache:
return self.cache[idx]
# 获取示例数据并转换为Tensor
img, label = self.data[idx]
img = transforms.ToTensor()(img)
# 应用变换
if self.transform is not None:
img = self.transform(img)
# 将转换后的数据缓存 (optional)
self.cache[idx] = img
return img, label
```
注意:这只是一些可能提高效率的建议,并不一定适用于所有数据集和变换。请根据您特定的应用程序进行适当的调整和测试。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)