【问题标题】:Adding the quantities of products in a dataframe column in Python在 Python 的数据框列中添加产品数量
【发布时间】:2018-04-29 13:54:36
【问题描述】:

我正在尝试在 Numpy/Pandas 的帮助下计算包含产品标题的 Excel 表列中的权重总和。我已经设法将工作表加载到数据框中,并隔离包含我正在寻找的特定产品的行:

dframe = xlsfile.parse('Sheet1')
dfFent = dframe[dframe['Product:'].str.contains("ABC") == True]

但是,由于问题的明显复杂性(如下所示),我似乎无法找到一种方法来总结其权重。例如。如果“产品标题”列包含以下值 -

  • 1 克 ABC
  • 98% 纯 12 克 ABC
  • 0.25公斤ABC粉
  • ABC 5gr

其中,ABC 是我要计算其重量的产品。有什么方法可以将这些重量加起来得到总共 268 克。任何指向解决方案的帮助或资源将不胜感激。谢谢! :)

【问题讨论】:

    标签: python excel pandas numpy


    【解决方案1】:

    您可以将extractall 用于带有单位或百分比的值:

    • (?P<a>\d+\.\d+|\d+) 表示将 float 或 int 提取到列 a
    • \s* - 数字和单位之间有零个或多个空格
    • (?P<b>[a-z%]+) 将数字后的小写单位或百分比提取到b

    #add all possible units to dictonary
    d = {'gm':1,'gr':1,'grams':1,'kg':1000,'%':.01}
    df1 =  df['Product:'].str.extractall('(?P<a>\d+\.\d+|\d+)\s*(?P<b>[a-z%]+)')
    print (df1)
                a      b
      match             
    0 0         1     gm
    1 0        98      %
      1        12  grams
    2 0      0.25     kg
    3 0         5     gr
    

    然后将第一列转换为所有单位的dictionary 的数字和第二个映射。然后通过unstackprod 重塑多列,最后sum

    a = df1['a'].astype(float).mul(df1['b'].map(d)).unstack().prod(axis=1).sum()
    print (a)
    267.76
    

    类似的解决方案:

    a = df1['a'].astype(float).mul(df1['b'].map(d)).prod(level=0).sum()
    

    【讨论】:

    • 非常感谢!像魅力一样工作。 :)
    • 有没有办法可以合并第 2 行和第 3 行(98 % 和 12 克)=>(0.98 x 12 克)?
    • 嗯,不明白。按百分比乘法单位 do .prod(axis=1)
    • 那么,dfWts['Qty'].astype(float).mul(dfWts['Unit'].map(d)).unstack().prod(axis=1) 是所有项目的权重列表?
    • 是的,完全正确。如果不是百分比,则它不会在函数prod 中倍数(此函数仅将一列逐一倍增。)
    【解决方案2】:

    您需要进行一些数据整理以使列以相同的格式保持一致。您可以进行一些匹配并尝试使 Product 列对齐和一致,类似于日期时间格式。

    就像你可以做以下事情。

    • 创建一个仅包含值的单独列(float)
    • 将 % 值更改为小数并乘以数量
    • 将值替换为kggrams
    • 没有任何字符串,只有浮动列才能得到总数。

    Pandas 可以很好地解决这个问题。

    注意:这个问题没有捷径可走,你需要去掉混合了十进制值的字符串来计算总和。

    【讨论】:

      猜你喜欢
      • 2021-07-02
      • 2021-04-06
      • 2021-01-11
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      相关资源
      最近更新 更多