首页 > 其他分享 >记录一个多对多数据匹配,但是效率不高

记录一个多对多数据匹配,但是效率不高

时间:2024-05-22 22:18:05浏览次数:27  
标签:used 匹配 一个多 df list result input total 不高

import itertools import os import pandas as pd def get_result(hope, list_input, used): """ :param hope: # 期望相加所得参数 :param list_input: # 所有数值 :param used: # 已使用过列表,起始数据为空 :return: """ def generate_combination(items, length): for combination in itertools.combinations(items, length): result_generate = list(combination) # print(result) yield result_generate # 容差值,避免float计算过小 epsilon = 0.001 # 剔除大于目标值部分的列表内容不进行计算 larger_list = [i for i in list_input if i > hope] step_1_list = list(set(list_input) - set(larger_list)) # 剔除已使用过数据 # print(used) step_1_list = list(set(step_1_list) - set(used)) # 根据初步判断后的step_1_list,迭代每一种数据长度的可能性 result = [] for i in range(1, len(step_1_list) + 1): # print('当前判断长度:' + str(i)) # 用迭代器 按照每种长度 生成每种可能 calculate = generate_combination(items=step_1_list, length=i) # 循环迭代结果 for x in calculate: # 对迭代器中每个元组求和 if abs(sum(x) - hope) <= epsilon: result = x used = x # print('计算出', hope, ',组合是', result) # 计算出结果,则该 break # 如果计算出结果,则终止对迭代结果循环 else: # print('无结果') continue # 未计算出结果,继续对迭代结果循环 break # if True 则终止对所有长度可能的循环 return hope, result, used if __name__ == '__main__': # 准备填数文件和基础参数 input_path = '数据求和匹配.xlsx' output_path = '数据求和匹配结果.xlsx' df_input = pd.DataFrame(columns=['求和标识', '求和列', '计算标识', '计算列']) # 若不存在前期文件,则新建模板用于计算 if not os.path.exists(input_path): df_input.to_excel(input_path, index=False) os.system(input_path) # 根据df_input取数list1 list2 df_input = pd.read_excel(input_path, dtype=str) df_input.fillna(0, inplace=True) list1 = df_input['计算列'].astype(float).tolist() list2 = df_input['求和列'].astype(float).tolist() print(sum(list1), sum(list2)) # 开始运行,used装填已使用过数据 新建df数据用于汇总全部数据 used = [] df_total = pd.DataFrame() for i in list2: if i != 0: end = get_result(i, list1, used=used) sus_hope = end[0] # 求和数据 sus_result = end[1] # 求和列表 print(sus_hope, '计算结果', sus_result) sus_used = end[2] # 已使用数据 sus_used = used.extend(sus_used) # 组合hope和resu为结果数据 df_division = pd.DataFrame(columns=['计算列'], data=sus_result) df_division['求和列'] = sus_hope df_total = pd.concat([df_division, df_total]) df_total['求和列'] = df_total['求和列'].astype(str) df_total['计算列'] = df_total['计算列'].astype(str) add_df = df_input[['求和列', '求和标识']] df_total = pd.merge(df_total, add_df, on='求和列') cal_df = df_input[['计算列', '计算标识']] df_total = pd.merge(df_total, cal_df, on='计算列') print(df_total) df_result = pd.DataFrame(columns=['计算列', '计算标识', '求和标识', '求和列']) df_result = pd.concat([df_result, df_total]) df_result.to_excel('result.xlsx', index=False) os.system('result.xlsx')

标签:used,匹配,一个多,df,list,result,input,total,不高
From: https://www.cnblogs.com/AZ26/p/18207262

相关文章

  • NDT匹配
    1前置知识2正态分布变换(NDT)以往的激光匹配方法有ICP方法及基于特征提取的方法,基于ICP方法因为需要绝对对应有可能出现不能收敛的情况,基于特征方法大多数需要做额外的复杂数据预处理,论文作者提出了一种基于概率的方法,NDT匹配2.1基本思路这里首先针对一帧单独的点云。NDT通......
  • (文件[夹]批量分类整理_多级匹配_交叉匹配_路径结构交叉调整)文件[夹]批量复制
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z需要先看之前发布的文章: 《如何批量复制多个文件到多个目录中(提取匹配法)》原理:对来源路径和终点路径  多次提取出关键词,再自由组合成 匹配词 情景再现:我这里有8张图片,模拟要整理的文件,路径分别如下:C......
  • 利用MKL实现OpenCV的模板匹配(matchTemplate)
    基于FFT实现OpenCV的模板匹配(matchTemplate)以TM_CCORR_NORMED为例,因为这个实现简单,并且效率高。先看公式\[R(x,y)=\frac{\sum_{x',y'}(T(x',y')\cdotI(x+x',y+y'))}{\sqrt{\sum_{x',y'}T(x',y')^2\cdot\sum_{x',y'}I(......
  • 二分图的最大匹配(匈牙利算法)代码
    二分图的最大匹配代码#include<bits/stdc++.h>usingnamespacestd;constintN=505,M=100005;inth[N],e[M],ne[M],idx;intmatch[N];boolst[N];intn1,n2,m;voidadd(inta,intb){e[idx]=b;//e[idx]存放的是第idx条边的终点ne[idx]=h......
  • P6577 【模板】二分图最大权完美匹配 (KM)
    $\quad$初看就发现不对劲了,模板紫题,一看就不简单,就交了个裸\(KM\),哎,果然\(T\)了。$\quad$然后就是大力卡常(当然\(O(n^4)\))的复杂度不是卡常能解决的。遂看题解,发现一个据说\(O(n^3)\)的复杂度的\(KM\),也是非常抽象。具体解释详见https://www.luogu.com.cn/article/ip2m1gu......
  • 如何批量复制多个文件到多个目录中(提取匹配法)
    首先,需要用到的这个工具:度娘网盘提取码:qwu2蓝奏云提取码:2r1z具体操作1、情景再现我这里创建了3个数字命名的文件夹和一些带有数字命名的图片文件。(这里仅做演示作用,实际操作的数量肯定巨大。)观察一下发现,图片分2种命名:一种是'数字.png',另一种是'-数字.png',前面带个了'-'......
  • 记字符串匹配KMP算法
    字符串匹配是一类经典的问题,在字符串s中找出模式串t第一个元素的下标,如果没有匹配到,则返回-1。此问题在leetcode中甚至归类为简单。解决此问题最直接的思路是使用暴力解法,从第0个元素开始逐个比较元素,当字符不匹配时,s的指针向前移动一位,不断重复。这种思路最简单且直接,但是无法通......
  • 贝壳面试:MySQL联合索引,最左匹配原则是什么?
    文章很长,且持续更新,建议收藏起来,慢慢读!疯狂创客圈总目录博客园版为您奉上珍贵的学习资源:免费赠送:《尼恩Java面试宝典》持续更新+史上最全+面试必备2000页+面试必备+大厂必备+涨薪必备免费赠送:《尼恩技术圣经+高并发系列PDF》,帮你实现技术自由,完成职业升级,薪......
  • 使用js有效括号匹配封装函数
    点击查看代码functionisValidParentheses(str){//定义一个栈,用于存储待匹配的左括号letstack=[];//定义一个对象,用于快速判断括号是否成对constpairs={')':'(','}':'{',']':'['};//遍历输入字符串for(let......
  • Linux 打印文本部分行内容(前几行,指定行,中间几行,跨行,奇偶行,后几行,最后一行,匹配行)
    背景打印对账文件最后一行汇总信息,顺便总结下Linux打印文本部分行内容的各种方法。测试文本#生成测试文本内容$seq-f"%02gdaodaotest"110>test.txt#查看测试文本内容,并显示行号$cat-ntest.txt101daodaotest202daodaotest3......