如何在Python中基于映射字典将列表列转为多列?
解决方案
问题描述
我有一个包含列表列的Pandas DataFrame:
import pandas as pd d = {'id': ["First", "Second"], 'list_column': [[1,2,3], [3,2]]} df = pd.DataFrame(data=d)
数据结构如下:
| id | list_column |
|---|---|
| First | [1, 2, 3] |
| Second | [3, 2] |
同时有一个将列表数值映射为目标列名的字典:
mapping_dict = { 1: "red", 2: "blue", 3: "green" }
需要将list_column转换为反映列表内容的多列,最终得到如下结果:
| id | red | blue | green |
|---|---|---|---|
| First | 1 | 1 | 1 |
| Second | 0 | 1 | 1 |
方法一:使用explode + get_dummies(高效向量化操作)
这种方法利用Pandas内置向量化函数,适合处理较大数据集:
import pandas as pd # 初始化数据 d = {'id': ["First", "Second"], 'list_column': [[1,2,3], [3,2]]} df = pd.DataFrame(data=d) mapping_dict = {1: "red", 2: "blue", 3: "green"} # 1. 展开列表列,将每个列表元素拆分为单独行 exploded_df = df.explode('list_column') # 2. 用字典映射替换数值为列名 exploded_df['list_column'] = exploded_df['list_column'].map(mapping_dict) # 3. 生成哑变量矩阵 dummies = pd.get_dummies(exploded_df, columns=['list_column'], prefix='', prefix_sep='') # 4. 按id分组求和,得到每个id对应的列标记(1表示存在,0表示不存在) result = dummies.groupby('id').sum().reset_index() print(result)
方法二:使用apply自定义逻辑(直观易懂)
如果需要更灵活的自定义逻辑,这种方法更直观:
import pandas as pd # 初始化数据 d = {'id': ["First", "Second"], 'list_column': [[1,2,3], [3,2]]} df = pd.DataFrame(data=d) mapping_dict = {1: "red", 2: "blue", 3: "green"} # 定义函数:将单个列表转换为对应列的0/1值 def convert_list_to_columns(lst): # 先初始化所有目标列为0 col_values = {col: 0 for col in mapping_dict.values()} # 遍历列表中的数值,映射后将对应列设为1 for num in lst: col_values[mapping_dict[num]] = 1 return pd.Series(col_values) # 应用函数并与原DataFrame的id列合并 result = df[['id']].join(df['list_column'].apply(convert_list_to_columns)) print(result)
两种方法最终都会输出目标格式的DataFrame。
内容的提问来源于stack exchange,提问作者MarkelleFultz
相关产品推荐
相关产品推荐

