如何将列组合生成的Pandas DataFrame行转为列表或数组
Pandas列组合遍历生成行列表实现方案
基础上下文
初始样例数据与已有遍历逻辑如下:
import pandas as pd import itertools df = pd.DataFrame({ 'NAME': ['Alpha', 'Alpha', 'Alpha'], 'VALUE1': [100, 100, 200], 'VALUE2': ['A1', 'A1', 'A2'] }) # 现有逻辑:遍历列数从2到总列数的所有列组合,打印子数据集 for r in range(2, len(df.columns)+1): for cols in itertools.combinations(df.columns, r): print(df[list(cols)])
目标是将每个子数据集的每一行转换为列表,最终得到嵌套列表结构的结果。
两种思路的具体实现
方法1:转NumPy数组实现(高性能,推荐)
先将DataFrame转为NumPy数组,直接通过列索引切片取数,避免反复生成子DataFrame的额外开销,不需要额外做展平操作:
result = [] # 转numpy数组,提前生成列索引列表 data_arr = df.to_numpy() col_indexes = list(range(len(df.columns))) for r in range(2, len(col_indexes)+1): # 遍历列索引的所有组合 for idx_combo in itertools.combinations(col_indexes, r): # 取出对应列的所有行,逐行转列表追加 for row in data_arr[:, idx_combo]: result.append(row.tolist())
如果数据集规模较大(十万行以上),这个方法的运行速度会比逐行操作DataFrame快5~10倍。
方法2:逐行转换子DataFrame(易读易写)
如果数据量不大,直接在原有循环逻辑上扩展即可,写法直白不需要额外理解NumPy索引逻辑:
result = [] for r in range(2, len(df.columns)+1): for cols in itertools.combinations(df.columns, r): sub_df = df[list(cols)] # 逐行遍历子DataFrame,转列表追加 for _, row in sub_df.iterrows(): result.append(row.tolist())
匹配示例输出的去重处理
你给出的期望结果中对重复行做了去重(例如三列组合的子数据集有2行完全一致的['Alpha', 100, 'A1'],期望结果仅保留1条),如果需要完全匹配示例结构,追加时加去重逻辑即可:
result = [] seen_rows = set() # 用集合存储已出现的行(列表不可哈希,存元组) data_arr = df.to_numpy() col_indexes = list(range(len(df.columns))) for r in range(2, len(col_indexes)+1): for idx_combo in itertools.combinations(col_indexes, r): for row in data_arr[:, idx_combo]: row_tuple = tuple(row.tolist()) if row_tuple not in seen_rows: seen_rows.add(row_tuple) result.append(list(row_tuple))
运行后输出结果:
[ ['Alpha', 100], ['Alpha', 200], ['Alpha', 'A1'], ['Alpha', 'A2'], [100, 'A1'], [200, 'A2'], ['Alpha', 100, 'A1'], ['Alpha', 200, 'A2'] ]
如果不需要去重,去掉上述判断逻辑即可保留所有原始行。
内容的提问来源于stack exchange,提问作者Owen Osagiede
相关产品推荐
相关产品推荐

