Разделите ячейки, создайте столбцы, посчитайте - PullRequest
0 голосов
/ 16 ноября 2018

Это многошаговое упражнение, которое, я подозреваю, может быть выполнено различными способами. Вот что я сделал и сделал.

tableA содержит магазины и бренды. таблица B содержит клиентов и магазины. Таблицы можно объединять в магазинах.

tableA = [(Ikea, 'Adidas, Nike'),
         (Target, 'Adidas, NB'),
         (Sears, 'Puma')]
labels = ['Store', 'Brand']
dfA = pd.DataFrame.from_records(tableA, columns=labels)

tableB = [('Neil', Ikea),
           ('Neil', Target),
           ('Javal', Target),
           ('Colleen', Ikea),
           ('Colleen', Sears),
           ('Javal', Target),
           ('Neil', Target),
           ('Colleen', Sears)]
labels = ['Customer', 'Store']
dfB = pd.DataFrame.from_records(tableB, columns=labels)

В качестве вывода я хочу иметь: Table

Клиенты в виде строк, бренды в столбцах и значения в качестве значений.

Во-первых, я хочу разобраться с делением клеток и подсчетом. Позже я присоединюсь к двум столам.

Расщепление

Лучшее, чего я могу достичь:

dfA['Adidas'], dfA['Nike'] = dfA['tags'].str.split(', ').str

Если я сделаю:

dfA['Adidas'], dfA['Nike'], dfA['NB'], dfA['Puma'] = dfA['tags'].str.split(', ').str

Я получаю ошибку:

ValueError: not enough values to unpack (expected 4, got 2)

Я понимаю природу ошибки, но пока не нашел альтернативы.

У меня есть вопросы:

(1) Должен ли я сначала разобраться с разбиением, а затем объединить таблицы?

(2) Как правильно разбить столбец?

(3) Как добавить правильное количество (Счетчик не имеет к этому никакого отношения, верно?)

1 Ответ

0 голосов
/ 16 ноября 2018

Вот решение, которое использует опции split и pivot table , которые @ G. Андерсон рекомендует вместе с melt перемещать бренды из столбцов в строки. Использование расплава может быть излишним / неуместным, но это обеспечивает то, что, по-видимому, является результатом, к которому вы стремитесь.

import pandas as pd

tableA = [('Ikea', 'Adidas, Nike'),
          ('Target', 'Adidas, NB'),
          ('Sears', 'Puma')]
labels = ['Store', 'Brand']
dfA = pd.DataFrame.from_records(tableA, columns=labels)
tableB = [('Neil', 'Ikea'),
          ('Neil', 'Target'),
          ('Javal', 'Target'),
          ('Colleen', 'Ikea'),
          ('Colleen', 'Sears'),
          ('Javal', 'Target'),
          ('Neil', 'Target'),
          ('Colleen', 'Sears')]
labels = ['Customer', 'Store']
dfB = pd.DataFrame.from_records(tableB, columns=labels)

# split Brands into multiple columns
dfA = pd.concat([dfA['Store'], dfA['Brand'].str.split(',', expand=True)], axis=1)

# convert multiple columns to records using pd.melt
dfA = pd.melt(dfA, 'Store', var_name='Col', value_name='Brand').reset_index().drop(columns=['index', 'Col'])

# merge together frames A & B
merged = dfB.merge(dfA, on='Store')

# pivot data
pd.pivot_table(merged, index='Customer', columns='Brand', aggfunc='count', fill_value=0)

Вот пример выходных данных.

        Store                  
Brand       NB  Nike Adidas Puma
Customer                        
Colleen      0     1      1    2
Javal        2     0      2    0
Neil         2     1      3    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...