首页 > 其他分享 >排序后扣减每行的数量

排序后扣减每行的数量

时间:2024-08-13 15:53:05浏览次数:5  
标签:basedf 扣减 qty DataFrame deductdf item 每行 pd 排序

import pandas as pd
from typing import Union, List
from copy import deepcopy

  

 

 

def deduct_by_sort(basedf: pd.DataFrame, sortby: List[str], ascending: List[bool],
                   deductdf: pd.DataFrame, key: Union[str, List[str]], deductfield:str) -> pd.DataFrame:
    """
    按排序后扣减每行的数量.
    df = pd.DataFrame([
        {'item': 'A', 'qty': 10},
        {'item': 'A', 'qty': 20},
        {'item': 'B', 'qty': 100},
        {'item': 'B', 'qty': 200},
        {'item': 'C', 'qty': 400},
        {'item': 'D', 'qty': 400},
    ])
    df1 = pd.DataFrame([
        {'item': 'A', 'qty': 14},
        {'item': 'B', 'qty': 140},
        {'item': 'C', 'qty': 30},
    ])
    # 结果
       item  qty
    0    A    0
    1    A   16
    2    B    0
    3    B  160
    4    C  370
    5    D  400
    """
    def validate(keys: list, df: pd.DataFrame):
        if not set(keys).issubset(set(list(df.columns))):
            raise KeyError('df必须包含所有的key')
    keylist = key if isinstance(key, list) else [key]
    for tmpdf in [basedf, deductdf]:
        validate(keylist, tmpdf)
    basedf = basedf.sort_values(by=sortby, ascending=ascending)
    basedf_not_in_deductdf = deepcopy(basedf)
    for k in keylist:
        basedf_not_in_deductdf = basedf_not_in_deductdf[~basedf_not_in_deductdf[k].isin(deductdf[k])]
    deductdf = deductdf.groupby(key, as_index=False)[[deductfield]].sum()
    r = pd.DataFrame()
    for _, row in deductdf.iterrows():
        balance = row[deductfield]
        for _, hrow in basedf.iterrows():
            a = True
            for k in keylist:
                if hrow[k] != row[k]:
                    a = False
                    break
            if a:
                if balance >= hrow[deductfield]:
                    balance = balance - hrow[deductfield]
                    hrow[deductfield] = 0
                else:
                    hrow[deductfield] = hrow[deductfield] - balance
                    balance = 0
                r = pd.concat([r, pd.DataFrame([hrow])], axis=0)
    r = pd.concat([r, basedf_not_in_deductdf], axis=0)
    return r

  

标签:basedf,扣减,qty,DataFrame,deductdf,item,每行,pd,排序
From: https://www.cnblogs.com/pythonClub/p/18357072

相关文章

  • QSortFilterProxyModel和QTreeView排序功能
    1、需求,创建一个树有多层结构,同一层按照插入顺序逆序排列; ui.treeView->setHeaderHidden(true);//treewidget头标题是否显示,此处隐藏标题//ui.treeWidget->header()->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);ui.treeView->header()->s......
  • 排序算法之总述
    title:排序算法date:2024-7-1815:20:07+0800categories:汇总tags:排序算法时间复杂度汇总description:排序算法(sortingalgorithm)用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用,因为有序数据通常能够被更高效地查找、分析和处理。math:true排......
  • 排序算法之桶排序
    title:桶排序date:2024-7-2518:58:19+0800categories:排序算法tags:排序算法桶排序description:桶排序(bucketsort)是分治策略的一个典型应用。它通过设置一些具有大小顺序的桶,每个桶对应一个数据范围,将数据平均分配到各个桶中;然后,在每个桶内部分别执行排序;最终按......
  • 排序算法之归并排序
    title:归并排序date:2024-7-1915:03:06+0800categories:排序算法tags:排序算法归并排序description:归并排序(MergeSort)是一种基于分治法的有效排序算法。它将一个列表分成较小的子列表,对每个子列表进行排序,然后合并这些子列表以产生一个有序列表。math:true......
  • 怎样在 SQL 中对一个包含销售数据的表按照销售额进行降序排序?
    在当今数字化商业的浪潮中,数据就是企业的宝贵资产。对于销售数据的有效管理和分析,能够为企业的决策提供关键的支持。而在SQL中,对销售数据按照销售额进行降序排序,是一项基础但极其重要的操作。想象一下,您面前有一张庞大的销售数据表,其中记录了各种产品在不同时间、不同地......
  • 【算法学习】排序算法汇总
    冒泡排序1、冒泡排序简介冒泡排序的英文BubbleSort,是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动冒泡排序的原理:冒泡轮数:每一轮只能将该轮中最大的数排至最后面。即第一轮只能确定将末位上的数归位......
  • 排序算法 内省排序(STL sort) IntroSort --C/C++
    内观排序/内省排序内省排序-维基百科,自由的百科全书(wikipedia.org)内省排序(英语:Introsort)是由大卫·穆塞尔在1997年设计的排序算法。这个排序算法首先从快速排序开始,当递归深度超过一定深度(深度为排序元素数量的对数值)后转为堆排序。采用这个方法,内省排序既能在常规数据集......
  • 排序算法
    排序算法目录排序算法算法的稳定性1.冒泡排序1.算法步骤2.动图演示2.选择排序1.算法步骤2.动图演示3.插入排序1.算法步骤2.动图演示a.直接插入排序b.算法优化--->二分插入排序4.希尔排序5.归并排序2.算法步骤3.动图演示分析:6.堆排序分析:算法步骤7.快速排序算法步骤分析:......
  • 冒泡排序(JAVA)
    冒泡排序的过程排序次数是外层循环(5-1)交换次数是内层循环(5-i-1)importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){intarr[]=newint[5];inttemp;System.out.println("请输入5名学生的成绩......
  • 探索Python中的插入排序算法
    探索Python中的插入排序算法插入排序(InsertionSort)是一种简单直观的排序算法。虽然在大规模数据集上效率不如一些高级排序算法,但插入排序在处理小规模数据集或部分有序的数据时表现非常优秀。本文将介绍插入排序的工作原理、实现方法以及它的时间复杂度。插入排序的工作......