如何提取Pandas列中语言字符串并编码为多标签新列
解决方案
我们可以通过以下步骤实现需求:
步骤1:准备数据并统一格式
首先处理语言列里的格式不一致问题(比如German C2缺少分隔符-),统一为语言 - 等级的格式:
import pandas as pd # 构造示例数据 data = { "编号": ["01", "02", "03", "04", "05", "06", "07", "08"], "语言": [ "Spanish - C1", "No", "Spanish - B2", "Spanish - C1 / German - C1 / Portuguese - C1", "No", "German C2", "No", "Spanish - B2 / Portuguese - C1" ] } df = pd.DataFrame(data) # 统一格式:把"语言 等级"替换成"语言 - 等级" df["语言"] = df["语言"].str.replace(r'(\w+) (\w+)', r'\1 - \2', regex=True)
步骤2:拆分语言条目并处理"无语言"情况
将多语言条目拆分为列表,同时把No标记为单独的"无语言"类别:
# 拆分语言列,处理No的情况 def split_languages(s): if s == "No": return ["无语言"] else: # 按 / 分割并去除前后空格 return [lang.strip() for lang in s.split("/")] df["语言列表"] = df["语言"].apply(split_languages)
步骤3:生成所有唯一的语言类别并排序
提取所有出现过的语言等级组合,加上"无语言",然后按字母顺序排序:
# 获取所有唯一的语言类别 all_languages = set() for langs in df["语言列表"]: all_languages.update(langs) # 转换为排序后的列表 sorted_languages = sorted(all_languages)
步骤4:生成哑变量列
遍历每个语言类别,对每行判断是否包含该类别,生成1/0的哑变量:
# 生成哑变量 for lang in sorted_languages: df[lang] = df["语言列表"].apply(lambda x: 1 if lang in x else 0) # 保留需要的列:编号 + 所有哑变量列 result_df = df[["编号"] + sorted_languages]
最终结果
运行上述代码后,result_df就是你需要的格式:
| 编号 | German - C1 | German - C2 | Portuguese - C1 | Spanish - B2 | Spanish - C1 | 无语言 |
|---|---|---|---|---|---|---|
| 01 | 0 | 0 | 0 | 0 | 1 | 0 |
| 02 | 0 | 0 | 0 | 0 | 0 | 1 |
| 03 | 0 | 0 | 0 | 1 | 0 | 0 |
| 04 | 1 | 0 | 1 | 0 | 1 | 0 |
| 05 | 0 | 0 | 0 | 0 | 0 | 1 |
| 06 | 0 | 1 | 0 | 0 | 0 | 0 |
| 07 | 0 | 0 | 0 | 0 | 0 | 1 |
| 08 | 0 | 0 | 1 | 1 | 0 | 0 |
说明
- 代码首先统一了语言格式,避免因分隔符不一致导致的类别重复
- 通过拆分和集合去重获取所有唯一的语言等级组合,再排序保证列的字母顺序
- 哑变量生成逻辑简单直接,确保每个条目对应正确的1/0标记
内容的提问来源于stack exchange,提问作者Runciter
相关产品推荐
相关产品推荐

