Python为pandas DataFrame分类列新增类别并填充值的方法
操作实现步骤
你可以通过维度补全的方式快速实现新增类别、对应均值字段填充的需求,具体操作如下:
首先提前导入需要的依赖,如果你已经在运行环境里加载了自有数据集,可以跳过构造示例数据的步骤:
import pandas as pd import numpy as np # 构造和你给出的示例完全一致的测试数据集 df = pd.DataFrame([ ["A",1,1,0.5],["A",1,2,0.3],["A",2,1,0.2],["A",3,1,0.1],["A",3,2,2.5], ["B",1,1,2.3],["B",1,2,5.2],["B",2,1,1.2],["B",2,2,8.0],["B",3,1,2.3],["B",3,2,0.9] ], columns=["name","product","Facility","mean"])
方法一:全量维度组合补全(推荐)
这个方法会自动保留原有所有数据,同时补全三个字段所有合法取值的交叉组合,不会出现遗漏:
- 先定义每个维度的完整取值列表,把你要新增的
Facility=3、product=4加入对应列表 - 生成三个维度的全量组合索引,和原表做匹配
- 缺失的
mean值按需填充为0或者NA即可
# 定义各维度全量合法取值 full_dimensions = { "name": df["name"].unique(), "product": [1, 2, 3, 4], # 原有取值1/2/3 + 新增类别4 "Facility": [1, 2, 3] # 原有取值1/2 + 新增类别3 } # 生成全量组合索引 full_index = pd.MultiIndex.from_product( iterables=full_dimensions.values(), names=full_dimensions.keys() ) # 匹配原表数据,补全缺失组合 df_result = df.set_index(["name","product","Facility"]).reindex(full_index).reset_index() # 填充mean值:需要填0就执行下面这行,需要填NA(pandas默认缺失值)就注释掉这行 df_result["mean"] = df_result["mean"].fillna(0)
方法二:手动追加指定行
如果你不需要补全所有交叉组合,只需要追加指定的新增类别行,可以直接构造新行拼接到原表:
new_rows = [] # 遍历所有name值,给每个name生成对应的新类别行 for name_val in df["name"].unique(): # 追加Facility=3对应的所有product行 for product_val in [1,2,3,4]: new_rows.append({ "name": name_val, "product": product_val, "Facility": 3, "mean": 0 # 要填充NA就把0改成np.nan }) # 追加product=4对应的原有Facility(1、2)行 for facility_val in [1,2]: new_rows.append({ "name": name_val, "product": 4, "Facility": facility_val, "mean": 0 }) # 拼接新行到原表,去重避免重复数据 df_result = pd.concat([df, pd.DataFrame(new_rows)]).drop_duplicates( subset=["name","product","Facility"], keep="first" ).reset_index(drop=True)
结果校验
处理完成后可以执行以下代码确认结果符合预期:
# 确认Facility列包含新增的3 print("Facility列所有取值:", df_result["Facility"].unique()) # 确认product列包含新增的4 print("product列所有取值:", df_result["product"].unique()) # 查看新增类别的mean值填充情况 print(df_result[(df_result["Facility"]==3) | (df_result["product"]==4)])
内容的提问来源于stack exchange,提问作者tsy1
相关产品推荐
相关产品推荐

