在 python 相交后我得到一个空列表

I getting an empty lists after intersect in python

我有 2 列,每列有 5 个单词。

例如:
x=[狗|猫|老鼠|新|世界]
y=[鱼|猫|新|东西|不错]

我需要找到它们之间的交集 [cat|new]。

但它向我显示了一个空列表。你知道为什么吗?

data = pd.read_csv('data.csv')

intersect1=[]
    
for j in range(len(data)):
    #print('==========================================================================')
        x=str(data.iloc[:, 2]).split("|")
        y=str(data.iloc[:, 3]).split("|")  


        #get_jaccard_sim(x, y) 
    
        #intersect.append(result)


        intersect= list(set(x) & set(y))   
        intersect1.append(intersect)
    
#print(inter)
print(intersect1)

我刚刚使用以下代码进行了测试:

data1 = "dog|cat|mouse|new|world"
data2 = "fish|cat|new|thing|nice"

x = data1.split("|")
y = data2.split("|")

intersect= list(set(x) & set(y))

print(intersect)

这会输出 ['cat', 'new'],这正是您所期望的。请注意 xy 是包含单词作为单独字符串的数组,:

['dog', 'cat', 'mouse', 'new', 'world'] # this is x
['fish', 'cat', 'new', 'thing', 'nice'] # this is y

确保您的代码也是如此!

问题出在您的迭代循环中,当您只想 select 逐行 select 每个值时,当您执行 data.iloc[:,2] 时,您正在 select 整列。更改 : 以在循环中使用计数器,j.

df = pd.DataFrame({'x': ['dog|cat|mouse|new|world'],
                   'y': ['fish|cat|new|thing|nice']})
  
for j in range(len(df)):
      x=str(df.iloc[j, 0]).split("|")
      y=str(df.iloc[j, 1]).split("|")
      intersect= list(set(x) & set(y))   

print(intersect)

输出:

['new', 'cat']

即使您在循环中添加了代码,您实际上并没有遍历数据框。假设您的数据是这种形状:

    one two
0   [dog|cat|mouse|new|world]   [fish|cat|new|thing|nice]
1   [dog|cat|mouse|new|world]   [fish|cat|new|thing|nice]
2   [dog|cat|mouse|new|world]   [fish|cat|new|thing|nice]
3   [dog|cat|mouse|new|world]   [fish|cat|new|thing|nice]
4   [dog|cat|mouse|new|world]   [fish|cat|new|thing|nice]
5   [dog|cat|mouse|new|world]   [fish|cat|new|thing|nice]
6   [dog|cat|mouse|new|world]   [fish|cat|new|thing|nice]
7   [dog|cat|mouse|new|world]   [fish|cat|new|thing|nice]
8   [dog|cat|mouse|new|world]   [fish|cat|new|thing|nice]
...

然后假设您感兴趣的列是 2 和 3,这样修改就可以了:

for j in range(len(data)):
    x = data.iloc[j, 2][0].split('|')
    y = data.iloc[j, 3][0].split('|')
    intersect = list(set(x) & set(y))