1. 预处理核心代码
# ========== 1) 预处理 ==========
def prepare_mercari_basic(df: pd.DataFrame,
category_col: str = "category_name",
brand_fill: str = "No Brand",
desc_fill: str = "No description",
cat_fill: str = "Unknown",
keep_original_category: bool = True) -> pd.DataFrame:
"""
1) 填充 brand_name / item_description
2) 安全拆分 category_name -> cat1/cat2/cat3(兼容缺失/层级不全/过多)
"""
df = df.copy()
if "brand_name" in df.columns:
df["brand_name"] = df["brand_name"].fillna(brand_fill)
if "item_description" in df.columns:
df["item_description"] = df["item_description"].fillna(desc_fill)
if category_col in df.columns:
cats = (
df[category_col]
.fillna("")
.str.extract(r"([^/]*)(?:/([^/]*))?(?:/(.*))?")
.rename(columns={0: "cat1", 1: "cat2", 2: "cat3"})
)
cats = cats.replace("", np.nan).fillna(cat_fill)
if not keep_original_category:
df = df.drop(columns=[category_col])
df = pd.concat([df, cats], axis=1)
return df
def shrink_brands_for_ohe(df: pd.DataFrame, col: str = "brand_name", top_n: int = 4000) -> pd.DataFrame:
"""保留高频品牌,其余归为 'Other',降低 OHE 维度"""
df = df.copy()
if col not in df.columns:
return df
top = df[col].value_counts().nlargest(top_n).index
df[col] = np.where(df[col].isin(top), df[col], "Other")
return df
以上代码主要是完成对数据集的缺失值补全以及类别的分拆,下面我们来一一分析。
2. 缺失值补齐
按照前文的分析,缺失值主要体现在品牌(brand_name)字段和商品描述字段(item_description),我们补齐的策略是“老老实实”补一个“不知道”,也即品牌补充“No Brand”,商品描述补充“No Description”。
if "brand_name" in df.columns:
df["brand_name"] = df["brand_name"].fillna(brand_fill) # No Brand
if "item_description" in df.columns:
df["item_description"] = df["item_description"].fillna(desc_fill) # No Description
3. 类别的处理
原始的类别字段的格式为:
Cat 1/Cat 2/Cat3
而且,而且是不规则的。。。这个是最坑人的地方,有可能是这样:
Cat 1/Cat 2
有可能又是这样:
Cat 1/Cat 2/Cat 3/Cat 4
那鬼知道它会有几个层级,所以,我们简单处理,只抽3层,代码如下:
if category_col in df.columns:
cats = (
df[category_col]
.fillna("")
.str.extract(r"([^/]*)(?:/([^/]*))?(?:/(.*))?")
.rename(columns={0: "cat1", 1: "cat2", 2: "cat3"})
)
cats = cats.replace("", np.nan).fillna(cat_fill)
上面的代码,先把空值填充空字符串;然后用正则表达式只截三段,如果多余三段,则第三段及后面的内容都当成第三段处理;然后字段名重命名为“cat1”、“cat2”、“cat3”。
4. 品牌收缩
这个其实是个简单的概念,因为Mercari是个通用的二手交易平台,什么都卖(你想想国内的闲鱼),所以品牌字段多如牛毛,但是总会有高频的品牌和低频的品牌,品牌数量太多的话后续进行独热编码处理时,维度会过多,因此,需要划一条线,对Top N以下频率的统统归为Other.
经过以上的操作,我们的数据预处理结束了,很简单的一个步骤,这个数据集的字段本来就不多,我们下一篇文章就进入核心操作:特征工程。
Mercari价格预测数据预处理
- Mercari二手商店价格预测 - 数据预处理&spm=1001.2101.3001.5002&articleId=155077730&d=1&t=3&u=5e4d34282a8049219c1048d90564eac0)

被折叠的 条评论
为什么被折叠?



