我有以下代码作为示例(这是基于文本定义的成对相似性):
import pandas as pd
df = pd.read_csv("pairings.csv")
sample_list = df['fruit'].tolist()
sample_list 的输出如下:
['Apple, Orange', 'Pear, Apple, Grape',
'Plum, Orange, Pear, Banana, Grape, Apple']
我再次任意选择水果作为示例,我的实际数据集根据余弦相似性找到技术之间的分组,并根据它们的定义生成技术分组。
我试过了
for n in range(len(sample_list) + 1):
list_combinations += list(combinations(sample_list,n))
print(list_combinations)
和
for i in sample_test:
res = [(a, b) for idx, a in enumerate(sample_test) for b in sample_test[idx + 1:]]
但他们没有工作。我的目标是获得一个新的 csv,它显示列表中每个列表的所有对,这样它就可以读作(括号不会在那里,这只是为了进一步解释):
0 1
0 Apple Orange [from list 1]
1 Pear Apple [from list 2]
2 Pear Grape [from list 2]
3 Apple Grape [from list 2]
4 Plum Orange [from list 3]
5 Plum Pear [from list 3]
6 etc.
我需要知道如何遍历每个列表并获得所有可能的对。谢谢!
我认为这是一个两步问题。首先,将字符串内部列表转换为下面的列表(带有
[elem.strip() for elem in stringylist.split(',')]
)。然后,从该内部列表中找到所有元素对。
我们可以编写自己的方法来做到这一点,或者我们可以使用
itertools.combinations
为我们做到这一点。下面我选择使用itertools
from itertools import combinations
samplelist = [
'Apple, Orange', 'Pear, Apple, Grape',
'Plum, Orange, Pear, Banana, Grape, Apple'
]
def all_pairs(inlist):
ret = []
for liststr in inlist:
innerlist = [elem.strip() for elem in liststr.split(',')]
ret += list(combinations(innerlist, 2))
return ret
all_pairs(samplelist)
""" prints
[('Apple', 'Orange'),
('Pear', 'Apple'),
('Pear', 'Grape'),
('Apple', 'Grape'),
('Plum', 'Orange'),
('Plum', 'Pear'),
('Plum', 'Banana'),
('Plum', 'Grape'),
('Plum', 'Apple'),
('Orange', 'Pear'),
('Orange', 'Banana'),
('Orange', 'Grape'),
('Orange', 'Apple'),
('Pear', 'Banana'),
('Pear', 'Grape'),
('Pear', 'Apple'),
('Banana', 'Grape'),
('Banana', 'Apple'),
('Grape', 'Apple')]
"""
这解决了您遍历并找到所有对的问题。我想您可以将成对列表转换为 CSV?
在调用
combinations
.之前,您需要将字符串拆分为列表。
result = []
for s in sample_list:
result.extend(combinations(s.split(', '), r=2))
print(result)
输出:
[('Apple', 'Orange'),
('Pear', 'Apple'),
('Pear', 'Grape'),
('Apple', 'Grape'),
('Plum', 'Orange'),
('Plum', 'Pear'),
('Plum', 'Banana'),
('Plum', 'Grape'),
('Plum', 'Apple'),
('Orange', 'Pear'),
('Orange', 'Banana'),
('Orange', 'Grape'),
('Orange', 'Apple'),
('Pear', 'Banana'),
('Pear', 'Grape'),
('Pear', 'Apple'),
('Banana', 'Grape'),
('Banana', 'Apple'),
('Grape', 'Apple')]