pandas将IP多列平均值除以Input多列平均值生成新列报错如何解决
解决方案
错误原因
该报错由以下几个问题共同导致:
- argparse参数配置错误:你给
--ip_files、--input_files参数同时设置了action='append'和nargs='*',会导致传入的列名被解析为嵌套列表。例如你传入ip_test ip_test2 ip_test3,最终args.ip_files的结果是[['ip_test', 'ip_test2', 'ip_test3']],而非预期的一维列表。你取ip_files[0]会拿到包含3个列名的列表,df[ip_files[0]]返回3列的DataFrame,同理input侧也返回3列DataFrame,二者相除后是3列结果,赋值给单个新列时就会触发元素数量不匹配的报错。 - 计算逻辑不符合需求:原代码仅计算了第一组ip列除以第一组input列,没有实现「所有ip列平均值除以所有input列平均值」的要求。
- 遗漏结果保存逻辑:原代码计算完成后没有将结果输出到指定路径。
修正后完整代码
import argparse import pandas as pd def trans_eff(in_matrix, ip_files, input_files, save_path): # 读取原始输入矩阵 df = pd.read_csv(in_matrix, index_col=False) # 计算每行ip组平均值/input组平均值,保留1位小数和示例结果对齐 df['translational_efficiency'] = (df[ip_files].mean(axis=1) / df[input_files].mean(axis=1)).round(1) # 拼接输出路径,保存结果 output_path = f"{save_path.rstrip('/')}/trans_eff_matrix.csv" df.to_csv(output_path, index=False) if __name__ == '__main__': parser = argparse.ArgumentParser(description='基于merge_matrix.py生成的矩阵计算翻译效率并输出新矩阵') parser.add_argument("--in_matrix", required=True, help='merge_matrix.py生成的输入矩阵路径') # 去掉action='append',仅用nargs='*'接收多个列名,直接返回一维列表 parser.add_argument("--ip_files", required=True, nargs='*', help='所有ip分组的列名,空格分隔') parser.add_argument("--input_files", required=True, nargs='*', help='所有input分组的列名,空格分隔') parser.add_argument("--save_path", required=True, help='结果保存的目录路径') args = parser.parse_args() trans_eff(args.in_matrix, args.ip_files, args.input_files, args.save_path)
改动说明
- 修正了argparse参数配置,删除冗余的
action='append',保证传入的列名是可以直接用于pandas索引的一维列表 - 替换了计算逻辑,用
mean(axis=1)按行计算指定分组的平均值,再做除法,完全匹配需求,加了.round(1)保留1位小数和示例结果对齐,不需要可以直接删除该方法 - 补全了结果保存逻辑,会自动在指定的save_path目录下生成结果文件
内容的提问来源于stack exchange,提问作者johnman3910
相关产品推荐
相关产品推荐

