使用 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
我有一个数据,其中有一列包含一些词。我通过单词列表提取了一些单词,例如 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