Python 将多个相似产品合并为一个产品,并在数据框中显示合并产品的总和

Python 将多个相似产品合并为一个产品,并在数据框中显示合并产品的总和,python,pandas,Python,Pandas,你好,我今天刚从熊猫开始 我一直在为我的问题寻找答案,但我真的找不到任何解决办法 我正在分析我的泡泡茶店的销售数据 例如产品:芒果是芒果的子串 因此,它们应该只合并到一个产品中。当我在出纳系统中插入此产品时,我设法将其错误销售,但它们是相同的产品 我有一个名为df的数据帧,有123行x3列 例如: product_name product_sold product_revenue 04.Thaai Tea 10

你好,我今天刚从熊猫开始

我一直在为我的问题寻找答案,但我真的找不到任何解决办法

我正在分析我的泡泡茶店的销售数据

例如产品:芒果是芒果的子串

因此,它们应该只合并到一个产品中。当我在出纳系统中插入此产品时,我设法将其错误销售,但它们是相同的产品

我有一个名为df的数据帧,有123行x3列

例如:

product_name      product_sold              product_revenue

04.Thaai Tea                10                         650

06.Thaien Tea               25                        1625

08.Maango Tea               40                        2600

09.MangoIs Tea               5                         325

10.MangoKre Tea              5                         325
新df的预期输出:

product_name      product_sold              product_revenue

Thai Tea                    35                         2275

Mango Tea                   50                         3250
因此,在新的数据框架中,名称非常相似的多个产品应该只是一个产品,它应该能够在新的df中看到产品收入的结果。

试试这个


df.groupby(df[“产品名称”].str.split(“.”).str[-1]).sum()

它将在“.”处分裂字符串,并占据最后一部分

我认为你无法一下子做到这一点。我认为您需要创建一个查找

如果这是您当前的数据帧:

import pandas as pd
raw_data = {'product_name':    ['04.Thaai Tea', '06.Thaien Tea', 
                               '08.Maango Tea', '09.MangoIs Tea', 
                               '10.MangoKre Tea'],
        'product_sold':    [10, 25, 40, 5, 5],
        'product_revenue': [650, 1625, 2600, 325, 325]}

tea_data = pd.DataFrame(raw_data)
我认为您需要进行如下查找:

 # create a new dataframe that has correct mapping
raw_data_map = {'product_number':          ['04', '06', '08', '09', '10'],
                'product_name':            ['Thaai Tea', 'Thaien Tea', 'Maango Tea', 'MangoIs Tea', 'MangoKre Tea'],
                'product_tea_category':    ['Thai Tea', 'Thai Tea', 'Mango Tea', 'Mango Tea', 'Mango Tea']}

# create tea map
tea_map = pd.DataFrame(raw_data_map)
并从当前数据中“删除”产品编号:

# step one, strip off the first two characters and make a new column
tea_data['product number'] = tea_data['product_name'].str[:3]

# relpace '.' with null 
tea_data['product number'] = tea_data['product number'].str.replace('.', '')
然后,这将允许您合并并拉入
茶叶类别

tea_data.merge(tea_map[['product_number','product_tea_category']] , left_on='product number', right_on='product_number')
看起来是这样的:

最后,您可以运行
groupby
,以获得所需的结果:

tea_data.groupby(['product_tea_category']).sum()

我提出的方法与他们迄今为止提出的方法略有不同,但我认为这是解决您问题的最佳方法。我提出的解决方案基于(自然语言处理)

给定您的数据集输入和
类别列表
,我使用计算单词之间的距离。这样,即使有语法错误的单词也会与正确的单词相似(mango~mnagos,thaai~thaaien)
然后,我创建一个新列
extracted\u category
,该列是从
product\u name
中提取出来的,我在列
extracted\u category
上对它进行分组

以下是完整的代码:

import pandas as pd

categories = ["Mango", "Thai", "Green", "Black", "Brown", "Caramel", "Milk", "Coconut", "Coffee", "Cocos"]

def word2vec(word):
    from collections import Counter
    from math import sqrt

    # count the characters in word
    cw = Counter(word)
    # precomputes a set of the different characters
    sw = set(cw)
    # precomputes the "length" of the word vector
    lw = sqrt(sum(c*c for c in cw.values()))

    # return a tuple
    return cw, sw, lw

def cosdis(v1, v2):
    # which characters are common to the two words?
    common = v1[1].intersection(v2[1])
    # by definition of cosine distance we have
    return sum(v1[0][ch]*v2[0][ch] for ch in common)/v1[2]/v2[2]

def nearest_categories(word):
    d_sim = {category: cosdis(word2vec(word),word2vec(category)) for category in categories}
    return sorted(d_sim.items(), key=lambda x: x[1], reverse=True)

def extract_categories(descr):
    word = descr.split('.')[1].split(' ')[0]
    nearest_category = nearest_categories(word)[0]
    return nearest_category

####### ----------------------------------------- #######

raw_data = {'product_name':    ['04.Thaai Tea', '06.Thaien Tea', 
                               '08.Maango Tea', '09.MangoIs Tea', 
                               '10.MangoKre Tea'],
        'product_sold':    [10, 25, 40, 5, 5],
        'product_revenue': [650, 1625, 2600, 325, 325]}

df = pd.DataFrame(raw_data)
df['extracted_category'] = df['product_name'].apply(lambda name: extract_categories(name)[0])

df.groupby(df["extracted_category"]).sum()
结果:

                    product_sold  product_revenue
extracted_category                               
Mango                         50             3250
Thai                          35             2275

您可以使用str.replace方法和regex来删除前缀,为任何类型的分析创建可靠的脚本,我认为您需要在
产品名称
和所需的
产品类别
@Massifox之间创建某种映射,这是一个很棒的解决方案。你有任何与python相关的链接也使用类似的方法吗?余弦相似性是一个数学函数,允许我们计算两个数值向量之间的距离。在NLP中,它用于计算单词之间的相似度(文档之间生成的相似度更高)。好的,但是文件是由文本组成的,不是数字。。。第一步是将每个文档转换为数字向量。要做到这一点,有很多方法(包括我在示例中使用的word2vec,但可能不是最直观的方法)。将文档转换为数字向量的一个简单方法是利用布尔模型:给定公共词汇表,每个1表示文档中词汇表中的单词的存在,或者缺席。例如:给定词汇:['dog'、'cat'、'pizza']和两个文档d1=[“mydog”​​eat pizza“],d2=[“猫在桌子上”]将根据这个简单模型表示为两个布尔向量:v1=[1,0,1],v2=[0,0,1]。v1表示d1包含单词dog和pizza,v2包含单词cat。此时可以计算余弦距离或两个向量上的任何其他数学函数。显然,这只是一个让你快速了解游戏运作方式的例子:)让我知道我是否足够清楚,你是否喜欢@johnfreel的解释