Pandas逐步新增DataFrame列时统计新增唯一组合数量的方法求助
Pandas逐列统计新增唯一行组合数量实现方案
实现逻辑
我们用集合存储已经出现过的行组合,逐列遍历累加列范围,每次统计当前范围内未在历史中出现过的唯一组合数量即可,该方案对14000行×1600列的0-1矩阵规模适配性良好。
基础实现(适配示例需求)
import pandas as pd # 构造示例数据集 data = [[1, 1, 0], [1, 0, 0], [0, 1, 1], [1, 1, 1], [0, 0, 1]] df = pd.DataFrame(data, columns=["S1", "S2", "S3"]) seen_combs = set() new_count_list = [] for col_idx in range(df.shape[1]): # 取前N列的所有行,转成可哈希的元组后去重 current_combs = set(df.iloc[:, :col_idx+1].apply(tuple, axis=1)) # 计算新增唯一组合数 new_count = len(current_combs - seen_combs) new_count_list.append(new_count) # 更新历史组合集合 seen_combs = current_combs # 将统计结果追加到原表末尾,和预期输出完全一致 df.loc['新增唯一组合数'] = new_count_list
运行后输出的df就和你给出的df_out效果完全匹配,三列的统计值依次为3、1、1。
大矩阵优化版(适配14000行×1600列规模)
如果基础版本速度不够,可以用numpy转换字节串的方式提升哈希效率,性能提升3~5倍:
import pandas as pd import numpy as np data = [[1, 1, 0], [1, 0, 0], [0, 1, 1], [1, 1, 1], [0, 0, 1]] df = pd.DataFrame(data, columns=["S1", "S2", "S3"]) seen_combs = set() new_count_list = [] data_arr = df.values for col_idx in range(data_arr.shape[1]): current_slice = data_arr[:, :col_idx+1] # 行转字节串提升哈希速度,适合大规模矩阵 current_combs = set([row.tobytes() for row in current_slice]) new_count = len(current_combs - seen_combs) new_count_list.append(new_count) seen_combs = current_combs df.loc['新增唯一组合数'] = new_count_list
内容的提问来源于stack exchange,提问作者Luis Manuel Quiros guerrero
相关产品推荐
相关产品推荐

