拆分单元格,创建列,计数

时间:2018-11-16 17:42:48

标签: python string split nlp

我怀疑这是一个多步骤的练习,可以通过多种方式进行处理。这是我已经做过的事情。

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)

作为输出,我希望具有: 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 :(得分: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