使用 Python 中不同长度的第二个列表对第一个列表的值进行排序

Sort the values of first list using second list with different length in Python

我有一个数据,其中有一列包含一些词。我通过单词列表提取了一些单词,例如 ingredients_list=['water','milk', 'yeast', 'banana', 'sugar', 'ananas']。这是具有正确单词顺序的列表,每个单词都应按此顺序排序。 当我提取单词时,我创建了一系列提取的单词,但该系列中的某些行包含两个单词或没有单词。例如(一个系列的实际长度是25000):

index ingredients
0 sugar
1 yeast
2
3 ananas milk
4 sugar water
5 milk

我想要的是按照 ingredients_list 的顺序对那些包含两个单词的行进行排序,例如在索引 3 和 4 中。例如:

index ingredients
0 sugar
1 yeast
2
3 milk ananas
4 water sugar
5 milk

首先,我所做的是将空行替换为“未知”。 然后我尝试了一些代码:

ingredients_list=['water','milk', 'yeast', 'banana', 'sugar', 'ananas']
path = '|'.join(r"\b{}\b".format(x) for x in ingredients_list)
ing_l = df['ingredients'].str.findall(pat, flags=re.I).str.join(' ')
ing_l= ing_l.replace("","Unknown")

then to sort them accordingly to ingredients_list:

def sort_list(list1, list2):
    zipped_pairs = zip(list2, list1)
    z = [x for _, x in sorted(zipped_pairs)] 
    return z

words = sort_list(ing_l, ingredients_list)

OR

d = {v:i for i, v in enumerate(ing_l)}
r = sorted(ingredients_list, key=lambda v: d[v])

但我得到的是一个长度为 6 的列表,长度为 ingredients_list。 然后我试试:

ing_l= pd.DataFrame(ing_l)
ing_l['sort'] = [word for x in ingredients_list for word in ing_l if word == x]

但我有一些错误 ValueError: Length of values (0) does not match length of index (25000) 你有办法解决这个问题吗?非常感谢

您可以 apply sorted 在拆分字符串上使用自定义字典,然后再次 join

ingredients_list=['water','milk', 'yeast', 'banana', 'sugar', 'ananas']

order = {k:v for v,k in enumerate(ingredients_list)}

df['sorted_ingredients'] = (
  df['ingredients']
  .str.split()
  .apply(lambda x: ' '.join(sorted(x, key=order.get)) if isinstance(x, list) else x)
 )

输出:

   index   ingredients sorted_ingredients
0       0        sugar              sugar
1       1        yeast              yeast
2       2          NaN                NaN
3       3  ananas milk        milk ananas
4       4  sugar water        water sugar
5       5         milk               milk