【问题标题】:Splitting a column with list of tuples into a seperate columns将具有元组列表的列拆分为单独的列
【发布时间】:2020-10-09 08:55:14
【问题描述】:

我正在处理具有以下格式的 shopping_cart 列的数据框: 元组的第一个元素是订购的商品,第二个元素是为此类商品订购的数量:例如:[('Candle Inferno', 1), ('iAssist Line', 2)] 暗示 'Candle Inferno'买了一次,“iAssist Line”买了两次。

[('Candle Inferno', 1), ('iAssist Line', 2)]
[('Olivia x460', 1), ('Candle Inferno', 1),('Alcon 10', 2)]
[('Lucent 330S', 1), ('pearTV', 1), ('Universe Note', 2), ('Olivia x460', 2)]

我有以下代码用于分隔项目和数量,例如:

item_1    qty_item_1         item_2        qty_item_2
Alcon 10       1         Candle Inferno       2

代码:

item_1=[]
item_2=[]
item_3=[]
import re
for i in range(0,1):
    item1=str(list_of_items[i].split(',')[0].split(','))
    item2=str(list_of_items[i].split(',')[2].split(','))
    item3=str(list_of_items[i].split(',')[4].split(','))
    item_1.append((re.sub(r'[^\w]',' ',item1).strip()))
    item_2.append((re.sub(r'[^\w]',' ',item2).strip()))
    item_3.append((re.sub(r'[^\w]',' ',item3).strip()))

上面的方法可以拆分项目名称:第一项(item_1),第二项(item_2),但是,这太重复了。即使我尝试创建一个函数,如果元组的数量超过 3 或 4 个,该函数也会抛出错误并且也会失败

有没有更好的办法解决这个问题?

【问题讨论】:

  • 最终结果应该是什么?
  • 我已对问题进行了更改。如果需要进一步澄清,请告诉我

标签: python regex pandas dataframe


【解决方案1】:
def pretty_printer(l):
    header = "|".join(["item_%d\tquantity_%d" % (index+1, index+1) for index, _ in numerate(l)])
    items = "|".join(["%s\t%d" % (i[0], i[1]) for i in l])
    print(header)
    print(items)

    
l1 = [('Candle Inferno', 1), ('iAssist Line', 2)]
l2 = [('Olivia x460', 1), ('Candle Inferno', 1), ('Alcon 10', 2)]
l3 = [('Lucent 330S', 1), ('pearTV', 1), ('Universe Note', 2), ('Olivia x460', 2)]
    
pretty_printer(l1)
pretty_printer(l2)
pretty_printer(l3)

输出:

item_1  quantity_1|item_2   quantity_2
Candle Inferno  1|iAssist Line  2
item_1  quantity_1|item_2   quantity_2|item_3   quantity_3
Olivia x460 1|Candle Inferno    1|Alcon 10  2
item_1  quantity_1|item_2   quantity_2|item_3   quantity_3|item_4   quantity_4
Lucent 330S 1|pearTV    1|Universe Note 2|Olivia x460   2

【讨论】:

    【解决方案2】:

    由于您的目标似乎是“区分项目和数量”,因此以下可能会有所帮助。

    我想,但从你的问题中不清楚,list_of_items 看起来像(你的第二个例子):

    list_of_items = [('Olivia x460', 1), ('Candle Inferno', 1), ('Alcon 10', 2)]
    

    要将项目与数量分开,您可以执行以下操作:

    items, quantities = zip(*list_of_items)
    

    结果如下:

    items: ('Olivia x460', 'Candle Inferno', 'Alcon 10')
    quantities: (1, 1, 2)
    

    如果你想对整个列表这样做

    orders = [
        [('Candle Inferno', 1), ('iAssist Line', 2)],
        [('Olivia x460', 1), ('Candle Inferno', 1),('Alcon 10', 2)],
        [('Lucent 330S', 1), ('pearTV', 1), ('Universe Note', 2), ('Olivia x460', 2)],
    ]
    

    合并,然后这样的事情可能会起作用:

    from collections import defaultdict
    
    orders_consolidated = defaultdict(int)
    for order in orders:
        for item, quantity in order:
            orders_consolidated[item] += quantity
    
    items, quantities = zip(*orders_consolidated.items())
    

    结果如下:

    items: ('Candle Inferno', 'iAssist Line', 'Olivia x460', 'Alcon 10', 'Lucent 330S', 'pearTV', 'Universe Note')
    quantities: (2, 2, 3, 2, 1, 1, 2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 2018-05-17
      相关资源
      最近更新 更多