如何合并矩阵中前缀相同的列向量?
嘿,这个需求挺常见的,用Python的话不管是用Pandas库还是纯原生代码都能轻松解决!我给你两种方案,你可以按需选择:
方案一:用Pandas(推荐,适合大型矩阵)
Pandas处理这类表格数据简直是得心应手,步骤很清晰:
- 把你的数据转换成DataFrame格式
- 提取每个列名的前缀(按你的需求,就是开头完全相同的部分)
- 按前缀分组,每组取最大值(因为原数据是0/1,只要组内有1结果就是1,完美实现合并)
直接上代码:
import pandas as pd # 构造你的示例数据(实际使用时可以直接读取你的矩阵数据) data = { 'Ketchup': [0, 1, 0, 1], 'Ketchupwithgarlic': [1, 0, 0, 0], 'Ketchupspicy': [0, 0, 0, 0], 'Chips': [0, 0, 1, 0], 'Chipsorganic': [1, 0, 0, 0] } df = pd.DataFrame(data) # 提取列名的前缀(这里用正则匹配开头的大写字母+后续小写字母,适配你的列名格式) prefixes = df.columns.str.extract(r'^([A-Z][a-z]+)')[0] # 按前缀分组合并,取每组最大值(等价于逻辑或操作) merged_df = df.groupby(prefixes, axis=1).max() # 输出结果 print(merged_df)
运行后输出就是你想要的:
Ketchup Chips 0 1 1 1 1 0 2 0 1 3 1 0
如果你的列名前缀规则不同(比如是用下划线分隔的,像Ketchup_with_garlic),只要调整提取前缀的代码就行,比如改成prefixes = df.columns.str.split('_').str[0]。
方案二:纯Python实现(无需额外库)
如果不想用第三方库,用原生Python也能搞定,适合轻量数据或者不能安装库的场景:
# 你的原始矩阵数据和列名 raw_data = [ [0, 1, 0, 0, 1], [1, 0, 0, 0, 0], [0, 0, 0, 1, 0], [1, 0, 0, 0, 0] ] columns = ['Ketchup', 'Ketchupwithgarlic', 'Ketchupspicy', 'Chips', 'Chipsorganic'] # 第一步:建立前缀到列索引的映射 prefix_to_indices = {} for col_idx, col_name in enumerate(columns): # 提取前缀:这里取到第一个新的大写字母出现前的部分(适配你的列名格式) prefix = [] for char in col_name: if char.isupper() and prefix: break prefix.append(char) prefix = ''.join(prefix) if prefix not in prefix_to_indices: prefix_to_indices[prefix] = [] prefix_to_indices[prefix].append(col_idx) # 第二步:合并每行的数据 merged_data = [] for row in raw_data: new_row = [] for prefix in prefix_to_indices: # 检查该前缀下的所有列是否有1,有则为1,否则为0 has_one = any(row[idx] == 1 for idx in prefix_to_indices[prefix]) new_row.append(1 if has_one else 0) merged_data.append(new_row) # 第三步:打印结果 print('\t'.join(prefix_to_indices.keys())) for row in merged_data: print('\t'.join(map(str, row)))
这段代码运行后同样会输出你期望的结果~
内容的提问来源于stack exchange,提问作者nurma_a
相关产品推荐
相关产品推荐

