转换Pandas整数DataFrame:新增列并生成二进制矩阵(Python)
Pandas列表转退避矩阵的高效实现(Numpy版)
原始数据
import pandas as pd import numpy as np data = { 'object_1': [1, 3, 4, 50], 'object_2': [1, 50], 'object_3': [1, 3, 4, 5, 50], 'object_4': [3, 5, 47, 48] }
实现方案
以下是基于Numpy的无循环高效实现,直接生成目标退避矩阵:
# 提取所有出现过的数值并去重排序 all_values = [] for vals in data.values(): all_values.extend(vals) unique_vals = sorted(set(all_values)) # 初始化二进制矩阵,行数对应object数量,列数对应唯一值数量 binary_matrix = np.zeros((len(data), len(unique_vals)), dtype=int) # 批量匹配并填充1 for row_idx, vals in enumerate(data.values()): # 找到当前object数值在unique_vals中的位置 match_indices = np.isin(unique_vals, vals) binary_matrix[row_idx, match_indices] = 1 # 转换为DataFrame并设置索引和列名 result_df = pd.DataFrame( binary_matrix, index=data.keys(), columns=[str(val) for val in unique_vals] ) print(result_df)
输出结果
1 3 4 5 47 48 50 object_1 1 1 1 0 0 0 1 object_2 1 0 0 0 0 0 1 object_3 1 1 1 1 0 0 1 object_4 0 1 0 1 1 1 0
方案说明
- 利用
np.isin批量匹配数值位置,避免逐元素循环,大幅提升效率 - 仅保留出现过的数值作为列,自动实现"删除全0列"的要求
- Numpy矩阵操作比纯Pandas操作更适合大规模数据场景
内容的提问来源于stack exchange,提问作者Mr.Slow
相关产品推荐
相关产品推荐

