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