首页 > 解决方案 > 从列创建列表,保留重复项

问题描述

我正在尝试获取包含订单中每个项目的列表。我的数据是每行一个订单的格式,可能的项目作为列,每个项目的数量作为一个值。

我已经为独特的项目制定了一种方法,但如果重复的项目被多次包含,我真的更喜欢它。这是一个例子:

import pandas as pd 

# Example dataframe
data = {'Egg':[0, 2, 1], 'Toast':[2, 2, 1]} 
breakfast = pd.DataFrame(data) 

# Cycle through columns and replace numbers with food words
value_cols = list(breakfast)

for food in value_cols:
    breakfast.loc[breakfast[food] != 0, food] = food

# Create a list of foods
list_of_foods = breakfast.values.tolist()

# Remove empty values
list_of_foods = [[x for x in y if x != 0] for y in list_of_foods]

这给出了这样的列表列表:

[['Toast'], ['Egg', 'Toast'], ['Egg', 'Toast']]

但是,我真的想要这样的列表列表:

[['Toast', 'Toast'], ['Egg', 'Egg', 'Toast', 'Toast'], ['Egg', 'Toast']]

我真的想不出如何实现这一目标。我想知道复制有重复项目的行,但我也会以我认为的相同顺序复制非重复项目。有人有什么想法吗?

标签: pythonpandas

解决方案


想法是按每一行循环,按列名称压缩,并使用扁平嵌套列表重复值:

list_of_foods = [[c for a, b in zip(v, breakfast.columns) for c in [b] * a]
                  for v in breakfast.values]

print (list_of_foods)
[['Toast', 'Toast'], ['Egg', 'Egg', 'Toast', 'Toast'], ['Egg', 'Toast']]

推荐阅读