我怀疑这是一个多步骤的练习,可以通过多种方式进行处理。这是我已经做过的事情。
tableA包含商店和品牌。 tableB包含客户和商店。可以在商店中合并表。
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)
客户作为行,品牌作为列,计数为价值。
首先,我要处理拆分单元格和计数的问题。稍后,我将加入两个表。
分裂
我能做到的最好的是:
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)如何添加适当的计数(与计数器无关,对吧?)
答案 0 :(得分:0)
这是一个解决方案,它使用splitting推荐的pivot table和@G. Anderson选项以及melt来将品牌从列转换为行。使用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