python - 从列创建列表,保留重复项
问题描述
我正在尝试获取包含订单中每个项目的列表。我的数据是每行一个订单的格式,可能的项目作为列,每个项目的数量作为一个值。
我已经为独特的项目制定了一种方法,但如果重复的项目被多次包含,我真的更喜欢它。这是一个例子:
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']]
我真的想不出如何实现这一目标。我想知道复制有重复项目的行,但我也会以我认为的相同顺序复制非重复项目。有人有什么想法吗?
解决方案
想法是按每一行循环,按列名称压缩,并使用扁平嵌套列表重复值:
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']]
推荐阅读
- javascript - 在选项值中将值显示为选定状态
- swift - 手机验证完成后不调用 Firebase UI 委托方法
- xamarin.forms - MvvmCross + Xamarin.Forms:平板电脑和手机的不同页面布局
- go - 在关联表中插入时创建关联问题
- android - android:如何用动画显示视图的可见部分?
- python - 如何删除或更新每个网格的单元格
- android - 在 Recyclerview 中比较旧数据和新数据
- python - How to apply Optimizer on Variable in Chainer?
- javascript - 从输入类型文件 javascript 下载文件
- json - 空手道删除 JSON 的不同部分