如何基于其他列相关性填充Pandas DataFrame的error_text缺失值
基于特征相关性填充Pandas DataFrame中的缺失文本值
方法1:分组映射填充(适合存在重复特征组合的场景)
如果数据中存在重复的特征列组合(比如示例里最后一行和第3行的a、b、c完全一致),可以直接用非缺失的error_text值建立映射关系来填充。这种方法简单直接,适合有明确对应关系的场景。
代码示例:
import pandas as pd import numpy as np # 示例数据集 mydf_example = pd.DataFrame({'a':[1,2,3,4,5,6,3],'b':[10,20,30,40,50,60,30],'c':['a','b','c','d','e','f','c'], 'error_text':[np.nan,'some_text','other_text',np.nan,'more_text','another_text',np.nan]}) # 构建特征组合到error_text的映射字典(仅保留非缺失值的对应关系) error_map = mydf_example.dropna().set_index(['a','b','c'])['error_text'].to_dict() # 用映射填充缺失值 mydf_example['error_text'] = mydf_example.apply( lambda row: error_map.get((row['a'], row['b'], row['c']), row['error_text']), axis=1 ) print(mydf_example)
运行后,最后一行的error_text会被填充为other_text,和特征组合匹配的行保持一致。
方法2:监督式分类模型预测(适合相关性存在但无明确对应关系的场景)
当特征与error_text是相关但非完全匹配的关系时,可以用分类模型学习二者的映射模式,进而预测缺失值。常用模型包括随机森林、逻辑回归等,能充分利用特征间的相关性。
代码示例:
import pandas as pd import numpy as np from sklearn.ensemble import RandomForestClassifier from sklearn.preprocessing import OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline # 示例数据集 mydf_example = pd.DataFrame({'a':[1,2,3,4,5,6,3],'b':[10,20,30,40,50,60,30],'c':['a','b','c','d','e','f','c'], 'error_text':[np.nan,'some_text','other_text',np.nan,'more_text','another_text',np.nan]}) # 拆分数据集:有标签的训练集、待预测的缺失集 train_df = mydf_example.dropna().copy() test_df = mydf_example[mydf_example['error_text'].isna()].copy() # 定义特征类型:数值列、分类列 numeric_features = ['a', 'b'] categorical_features = ['c'] # 构建预处理管道:分类列独热编码,数值列直接保留 preprocessor = ColumnTransformer( transformers=[ ('num', 'passthrough', numeric_features), ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features) ]) # 构建模型管道 model = Pipeline(steps=[ ('preprocessor', preprocessor), ('classifier', RandomForestClassifier(n_estimators=100, random_state=42)) ]) # 训练模型 model.fit(train_df[['a','b','c']], train_df['error_text']) # 预测并填充缺失值 test_df['error_text'] = model.predict(test_df[['a','b','c']]) mydf_filled = pd.concat([train_df, test_df]).sort_index() print(mydf_filled)
这种方法能基于相似特征预测最可能的error_text值,即使没有完全匹配的特征组合也适用。
方法3:基于相关性的规则填充(适合数值特征与error_text有明确趋势的场景)
如果数值特征(比如a、b)和error_text相关性很高,可以根据数值区间或阈值自定义填充规则。比如你发现a值越小,对应某类error_text的概率越高。
代码示例:
import pandas as pd import numpy as np # 示例数据集 mydf_example = pd.DataFrame({'a':[1,2,3,4,5,6,3],'b':[10,20,30,40,50,60,30],'c':['a','b','c','d','e','f','c'], 'error_text':[np.nan,'some_text','other_text',np.nan,'more_text','another_text',np.nan]}) # 查看非缺失数据中a值与error_text的对应关系 corr_df = mydf_example.dropna() print(corr_df[['a','error_text']]) # 根据a的区间定义填充规则(可根据实际数据调整) def fill_error(row): if pd.isna(row['error_text']): if row['a'] <=2: return 'some_text' elif 2 < row['a'] <=4: return 'other_text' else: return 'more_text' else: return row['error_text'] mydf_example['error_text'] = mydf_example.apply(fill_error, axis=1) print(mydf_example)
这种方法适合特征与error_text有明显线性或区间关联的场景,规则可根据相关性分析结果灵活调整。
内容的提问来源于stack exchange,提问作者brenodacosta
相关产品推荐
相关产品推荐

