在数据处理和机器学习场景中,经常需要生成每列仅包含一个1、其余元素为0的二进制DataFrame,这类结构常用于特征编码、样本标签构造等场景。本文介绍使用Python的pandas库批量生成这类DataFrame集合的完整方法。

核心实现思路
要生成每列仅含一个1的二进制DataFrame,核心逻辑是:首先确定DataFrame的行数和列数,然后为每一列随机选择一个行索引,将该位置设为1,其余位置设为0。批量生成时只需要循环调用单组生成逻辑即可。
单组DataFrame生成实现
首先实现单个符合要求的DataFrame生成函数,具体代码如下:
import pandas as pd
import numpy as np
def generate_single_binary_df(rows, cols):
"""
生成行数为rows、列数为cols的二进制DataFrame,每列仅含一个1
:param rows: DataFrame的行数
:param cols: DataFrame的列数
:return: 符合要求的pandas DataFrame
"""
# 初始化全0矩阵
data = np.zeros((rows, cols), dtype=int)
# 为每一列随机选择行索引,将该位置设为1
for col_idx in range(cols):
row_idx = np.random.randint(0, rows)
data[row_idx, col_idx] = 1
# 构造列名
columns = [f'col_{i}' for i in range(cols)]
return pd.DataFrame(data, columns=columns)
# 测试生成3行4列的DataFrame
single_df = generate_single_binary_df(3, 4)
print(single_df)
上述代码运行后,会输出类似如下的结果,每一列都只有一个1:
col_0 col_1 col_2 col_3 0 0 1 0 0 1 1 0 0 1 2 0 0 1 0
批量生成DataFrame集合
基于单组生成函数,只需要添加循环逻辑即可批量生成多个符合要求的DataFrame,代码如下:
def batch_generate_binary_df(rows, cols, batch_size):
"""
批量生成每列仅含一个1的二进制DataFrame集合
:param rows: 每个DataFrame的行数
:param cols: 每个DataFrame的列数
:param batch_size: 批量生成的数量
:return: DataFrame集合,类型为列表
"""
df_list = []
for _ in range(batch_size):
df = generate_single_binary_df(rows, cols)
df_list.append(df)
return df_list
# 批量生成5个3行4列的符合要求的DataFrame
batch_dfs = batch_generate_binary_df(3, 4, 5)
# 打印第一个和最后一个DataFrame验证结果
print("第一个DataFrame:")
print(batch_dfs[0])
print("n最后一个DataFrame:")
print(batch_dfs[-1])
可选扩展:固定随机种子保证可复现
如果需要每次生成的DataFrame集合完全一致,可以在生成前设置随机种子,代码如下:
def batch_generate_binary_df_with_seed(rows, cols, batch_size, seed=42):
"""
带随机种子的批量生成函数,保证结果可复现
:param rows: 每个DataFrame的行数
:param cols: 每个DataFrame的列数
:param batch_size: 批量生成的数量
:param seed: 随机种子
:return: DataFrame集合,类型为列表
"""
np.random.seed(seed)
return batch_generate_binary_df(rows, cols, batch_size)
# 使用种子生成2个3行4列的DataFrame,多次运行结果一致
fixed_dfs = batch_generate_binary_df_with_seed(3, 4, 2, seed=100)
print(fixed_dfs[0])
注意事项
- 生成二进制矩阵时使用
dtype=int避免浮点型数值出现 - 如果行数小于列数,依然可以保证每列有一个1,因为每一列的1可以选择任意行,允许同一行有多个1
- 批量生成时如果数据量较大,可以考虑使用生成器减少内存占用