Python实现:为DataFrame补全缺失特征行(替代pyjanitor的complete方法)
替代pyjanitor的DataFrame特征补全方案
现有如下结构的DataFrame:
import pandas as pd df = pd.DataFrame({ 'ID': [1,1,1,1,2,2,3], 'feature': ['Color', 'Finish', 'Shelfs', 'WiFi', 'Shelfs', 'WiFi', 'Color'], 'feature_val': ['White', 'Steel', '2', 'Y', '3', 'N', 'Black'], 'source': ['A', 'A', 'B', 'B', 'A', 'A', 'B'] })
需求:为每个ID补全所有特征(Color、Finish、Shelfs、WiFi)对应的行,缺失特征的feature_val设为NaN,source设为UNK。
之前用pyjanitor的complete方法实现,但因安装问题需要替代方案,以下是基于原生pandas的实现:
实现步骤
- 生成所有ID与所有特征的全量组合(笛卡尔积)
- 将原始数据与全量组合做左连接,自动补全缺失行
- 对
source列的缺失值填充UNK,feature_val自然保留NaN
完整代码
# 获取所有唯一ID和所有特征(支持动态提取特征,无需硬编码) unique_ids = df['ID'].unique() all_features = df['feature'].unique() # 如果特征固定也可以直接写列表:['Color', 'Finish', 'Shelfs', 'WiFi'] # 生成ID-feature的全量组合 full_combinations = pd.MultiIndex.from_product( [unique_ids, all_features], names=['ID', 'feature'] ).to_frame(index=False) # 左连接原始数据,补全缺失行 complete_df = full_combinations.merge(df, on=['ID', 'feature'], how='left') # 填充source列的缺失值为UNK complete_df['source'] = complete_df['source'].fillna('UNK') # 查看结果 print(complete_df)
输出结果
ID feature feature_val source 0 1 Color White A 1 1 Finish Steel A 2 1 Shelfs 2 B 3 1 WiFi Y B 4 2 Color NaN UNK 5 2 Finish NaN UNK 6 2 Shelfs 3 A 7 2 WiFi N A 8 3 Color Black B 9 3 Finish NaN UNK 10 3 Shelfs NaN UNK 11 3 WiFi NaN UNK
内容的提问来源于stack exchange,提问作者R Shriya
相关产品推荐
相关产品推荐

