Объединение нескольких одинаковых продуктов в один продукт и отображение суммы объединенных продуктов в пандусе данных - PullRequest
1 голос
/ 22 сентября 2019

Фрейм данных выглядит следующим образом

Здравствуйте, я только сегодня начал с Pandas.

Я пытался найти ответ для своей проблемы, но я не могу 'не могу найти никакого решения.

Я пытаюсь проанализировать данные о продажах в моем магазине пузырькового чая.

Например, продукт: Манго является подстрокой Mangon

, поэтому их следует объединить только с одним продуктом.,Мне удалось ошибиться, когда я вставил этот продукт в систему кассира, но это один и тот же продукт.

У меня есть фрейм данных df с 123 строками x 3 столбцами.

Пример:

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

Таким образом, несколько продуктов с совершенно одинаковыми именами должны быть только одним продуктом в новом фрейме данных, и этодолжен быть в состоянии увидеть результат product_revenue в новом df.

Ответы [ 4 ]

3 голосов
/ 22 сентября 2019

Я предлагаю подход, немного отличающийся от тех, которые они предлагали до сих пор, но я думаю, что для вашей проблемы это лучшее решение.Решение, которое я предлагаю, основано на NLP (обработка естественного языка).

С учетом вашего ввода набора данных и списка categories я вычисляю расстояние междуслова, использующие word2vec и косинусное сходство .Таким образом, даже слова с грамматическими ошибками будут похожи на правильные слова (манго ~ mnagos, thaai ~ thaaien).
Затем я создаю новый столбец extracted_category, сформированный из product_name, и делаю group_by вверх по столбцу extracted_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
0 голосов
/ 22 сентября 2019

Обратите внимание, что при увеличении количества строк не удастся удалить определенное количество символов.Всегда будет необходимо найти точку .

Так что вам нужно сохранить str от точки, а затем сгруппировать, используя DataFrame.GroupBy и добавив

df['product_name']=[key[key.index('.')+1:] for key in df['product_name']]
print(df['product_name'])
df.groupby('product_name').sum()

O / P:

0     Thai_Tea
1     Thai_Tea
2    Mango_Tea
3    Mango_Tea
4    Mango_Tea
Name: product_name, dtype: object

                 product_sold   product_revenue
product_name            
Mango_Tea                  50              3250 
Thai_Tea                   35              2275 

, поскольку вы видите количество всех имен в столбце 'product_name' было удалено, затем сгруппировано и добавлено

0 голосов
/ 22 сентября 2019

Я не думаю, что вы можете сделать это одним махом.Я думаю, что вам нужно создать поиск.

Если это ваш текущий фрейм данных:

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)

И «удалить» product numberиз ваших текущих данных:

# 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 category:

tea_data.merge(tea_map[['product_number','product_tea_category']] , left_on='product number', right_on='product_number')

Что выглядит следующим образом: Screen Shot

Затем, наконец, вы можете запустить groupby, чтобы получить желаемый результат:

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

enter image description here

0 голосов
/ 22 сентября 2019

попробуйте это


df.groupby(df["product_name"].str.split(".").str[-1]).sum()

это разделит строку на "."и возьми последнюю часть

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...