如何高效利用两个二维NumPy数组构建含5000行配对数据的Pandas DataFrame
解决方法
先明确原始数据的生成逻辑:
import pandas as pd import numpy as np s = [ "S" + str(i) for i in range(1,101)] # 100个样本标签 c = [ "C" + str(i) for i in range(1,51)] # 50个类别标签 # arr1形状为(50,100):每行对应一个C,每列对应一个S arr1 = np.random.randn(len(c),len(s)) arr2 = np.random.randn(len(c),len(s))
你给出的代码无法得到预期结果,问题在于:
- 直接将
s和c传入DataFrame,两者长度不同(100 vs 50),无法生成5000行的笛卡尔积配对; arr1[s,c]是错误的索引方式——numpy数组仅支持整数位置索引,不能直接用字符串标签s/c取值。
正确实现方式(高效版)
利用Pandas多索引生成笛卡尔积,结合numpy数组展平操作,一步完成:
# 生成C和S的所有配对组合作为多索引 multi_index = pd.MultiIndex.from_product([c, s], names=['C', 'S']) # 将arr1、arr2展平为一维数组(顺序与多索引完全对应),转成DataFrame后重置索引 df = pd.DataFrame({ 'arr1_col': arr1.flatten(), 'arr2_col': arr2.flatten() }, index=multi_index).reset_index()
另一种实现方式(直观版)
如果需要更直观的配对生成逻辑,可用itertools.product生成所有(S,C)组合后逐个取值:
import itertools # 生成S和C的所有笛卡尔积配对 all_pairs = list(itertools.product(s, c)) # 提取对应arr1、arr2的值:arr1[C的索引, S的索引] arr1_values = [arr1[c.index(c_label), s.index(s_label)] for s_label, c_label in all_pairs] arr2_values = [arr2[c.index(c_label), s.index(s_label)] for s_label, c_label in all_pairs] # 构建DataFrame df = pd.DataFrame({ 'S': [pair[0] for pair in all_pairs], 'C': [pair[1] for pair in all_pairs], 'arr1_col': arr1_values, 'arr2_col': arr2_values })
两种方法最终都会得到5000行的DataFrame,每行对应一组(S,C)配对,arr1_col和arr2_col对应数组中的对应位置值。
内容的提问来源于stack exchange,提问作者burcak
相关产品推荐
相关产品推荐

