# 计算缺失值数量大于一半的列数 half_count = len(combined_df) / 2 missing_cols = missing_values[missing_values > half_count].index 如何计算缺失值大于百分之二十
时间: 2024-02-13 22:59:43 浏览: 177
要计算缺失值大于百分之二十的列数,可以按照以下步骤进行:
1. 计算数据框中每一列的缺失值数量,可以使用 Pandas 库中的 `isnull` 和 `sum` 函数来实现。例如:
```
missing_values = combined_df.isnull().sum()
```
2. 计算数据框中总共的行数,可以使用 Pandas 库中的 `len` 函数来实现。例如:
```
total_count = len(combined_df)
```
3. 计算缺失值大于百分之二十的列数,可以将缺失值数量大于总行数的百分之二十的列筛选出来,可以使用 Pandas 库中的 `loc` 函数和布尔索引来实现。例如:
```
threshold = total_count * 0.2 # 计算阈值
missing_cols = missing_values.loc[missing_values > threshold].index
```
这样,`missing_cols` 变量就包含了缺失值数量大于百分之二十的列的名称。需要注意的是,这种方法只是一种简单的筛选方法,不能保证筛选出来的列就一定不会对后续的计算产生影响,因此在使用数据进行计算时,需要对数据进行充分的清洗和预处理。
相关问题
将这段代码变为伪代码形式target_col = ["Outcome"] cat_cols = data.nunique()[data.nunique() < 12].keys().tolist() cat_cols = [x for x in cat_cols ] #numerical columns num_cols = [x for x in data.columns if x not in cat_cols + target_col] #Binary columns with 2 values bin_cols = data.nunique()[data.nunique() == 2].keys().tolist() #Columns more than 2 values multi_cols = [i for i in cat_cols if i not in bin_cols] #Label encoding Binary columns le = LabelEncoder() for i in bin_cols :median_target('BMI') data.loc[(data['Outcome'] == 0 ) & (data['BMI'].isnull()), 'BMI'] = 30.1 data.loc[(data['Outcome'] == 1 ) & (data['BMI'].isnull()), 'BMI'] = 34.3 data[i] = le.fit_transform(data[i]) #Duplicating columns for multi value columns data = pd.get_dummies(data = data,columns = multi_cols ) #Scaling Numerical columns std = StandardScaler() scaled = std.fit_transform(data[num_cols]) scaled = pd.DataFrame(scaled,columns=num_cols) #dropping original values merging scaled values for numerical columns df_data_og = data.copy() data = data.drop(columns = num_cols,axis = 1) data = data.merge(scaled,left_index=True,right_index=True,how = "left")
```
设置目标列为"Outcome"
将唯一值少于12个的列作为分类变量列,并存储在cat_cols列表中
从数据集中选择数值列,不包括分类变量和目标列,存储在num_cols列表中
将只有两个唯一值的列存储在bin_cols列表中
将多于两个唯一值的分类变量列存储在multi_cols列表中
对二元分类变量进行标签编码
对于缺失值的'BMI'列,使用中位数进行填充
将二元分类变量转换为数值列
对于有多个唯一值的分类变量列,将其转换为虚拟变量列
对于数值列,进行标准化处理
将标准化后的数值列与虚拟变量列合并,并在数据集中删除原始数值列
将数据集的副本存储在df_data_og中
```
目标编码 def gen_target_encoding_feats(train, train_2, test, encode_cols, target_col, n_fold=10): '''生成target encoding特征''' # for training set - cv tg_feats = np.zeros((train.shape[0], len(encode_cols))) kfold = StratifiedKFold(n_splits=n_fold, random_state=1024, shuffle=True) for _, (train_index, val_index) in enumerate(kfold.split(train[encode_cols], train[target_col])): df_train, df_val = train.iloc[train_index], train.iloc[val_index] for idx, col in enumerate(encode_cols): target_mean_dict = df_train.groupby(col)[target_col].mean() if not df_val[f'{col}_mean_target'].empty: df_val[f'{col}_mean_target'] = df_val[col].map(target_mean_dict) tg_feats[val_index, idx] = df_val[f'{col}_mean_target'].values for idx, encode_col in enumerate(encode_cols): train[f'{encode_col}_mean_target'] = tg_feats[:, idx] # for train_2 set - cv tg_feats = np.zeros((train_2.shape[0], len(encode_cols))) kfold = StratifiedKFold(n_splits=n_fold, random_state=1024, shuffle=True) for _, (train_index, val_index) in enumerate(kfold.split(train_2[encode_cols], train_2[target_col])): df_train, df_val = train_2.iloc[train_index], train_2.iloc[val_index] for idx, col in enumerate(encode_cols): target_mean_dict = df_train.groupby(col)[target_col].mean() if not df_val[f'{col}_mean_target'].empty: df_val[f'{col}_mean_target'] = df_val[col].map(target_mean_dict) tg_feats[val_index, idx] = df_val[f'{col}_mean_target'].values for idx, encode_col in enumerate(encode_cols): train_2[f'{encode_col}_mean_target'] = tg_feats[:, idx] # for testing set for col in encode_cols: target_mean_dict = train.groupby(col)[target_col].mean() test[f'{col}_mean_target'] = test[col].map(target_mean_dict) return train, train_2, test features = ['house_exist', 'debt_loan_ratio', 'industry', 'title'] train_1, train_2, test = gen_target_encoding_feats(train_1, train_2, test, features, ['isDefault'], n_fold=10) 出现报错
根据报错信息,可能是因为在验证集或测试集中有分类变量的某个值在训练集中没有出现,导致无法进行目标编码特征的计算。具体来说,可能是在计算`df_val[f'{col}_mean_target']`时出现了KeyError,即某个分类变量在验证集中出现了训练集中没有出现的值。
为了解决这个问题,你可以在计算目标编码特征之前,先检查验证集和测试集中的分类变量值是否都在训练集中出现过。你可以在循环开始之前使用`set()`函数获取训练集中某一列的所有可能值,然后在循环中判断验证集和测试集中该列的值是否都在这个集合中出现过,如果有值没有出现过,则可以将其替换为训练集中该列的众数或其他默认值。
具体来说,你可以在`for idx, col in enumerate(encode_cols):`循环开始之前,加入以下代码:
```python
# get all possible values for the current column
col_values = set(train[col].unique())
if None in col_values:
col_values.remove(None)
# replace value with mode if it does not appear in the training set
mode = train[col].mode()[0]
df_val.loc[~df_val[col].isin(col_values), f'{col}_mean_target'] = mode
test.loc[~test[col].isin(col_values), f'{col}_mean_target'] = mode
```
这样就可以避免由于验证集或测试集中某个分类变量的某个值在训练集中没有出现而导致的KeyError报错。
阅读全文