在csv文件

时间:2018-03-31 18:06:05

标签: python arrays string pandas csv

我正在尝试使用python进行字符串匹配。我有.csv数据,如:

Item_ID»Item_Name
101»tomato
102»tomatos
103»tomatoes
104»tomato

»代表标签\t字符。)

我希望输出如下:

Item_ID»Item_ID1»Similarity
101»102»92
101»103»73
101»104»100
102»101»92
102»103»85
102»104»92
104»101»100
104»102»92
104»103»73

Item_Name可以相同,但它具有不同的ID,相似性应基于Item_name,但要与每个Item_ID一起计算。你能帮我解决这个python代码吗?

2 个答案:

答案 0 :(得分:1)

您可以在list dict中阅读输入内容,如我的示例所示。

然后,您可以使用itertools.combinations(data, 2)获取所有对。

import itertools
import random

def get_similarity(obj1, obj2):
    # your own get_similarity function using obj1['name'], obj2['id'], etc
    # here I'm just returning random number
    return random.randint(1, 100)

data = [
    {'id': 101, 'name': 'tomato'},
    {'id': 102, 'name': 'tomatos'},
    {'id': 103, 'name': 'tomatoes'},
    {'id': 104, 'name': 'tomato'},
]

print('Item_ID1', '\t', 'Item_ID2', '\t', 'Similarity')
for obj1, obj2 in itertools.combinations(data, 2):
    similarity = get_similarity(obj1, obj2)
    print(obj1['id'], '\t', obj2['id'], '\t', similarity)

此输出

Item_ID1     Item_ID2    Similarity
101      102     89
101      103     83
101      104     75
102      103     9
102      104     3
103      104     86

在您的示例输出中,您重复两次相同的对(例如,(101,104)和(104,101)。

如果是这样的话,您只需按照交换的对象顺序打印同一对:

for obj1, obj2 in itertools.combinations(data, 2):
    similarity = get_similarity(obj1, obj2)
    print(obj1['id'], '\t', obj2['id'], '\t', similarity)
    print(obj2['id'], '\t', obj1['id'], '\t', similarity)

答案 1 :(得分:1)

以下是我如何通过pandas实现您的逻辑。

import pandas as pd
from difflib import SequenceMatcher
from io import StringIO
from itertools import combinations

mystr = StringIO("""Item_ID Item_Name
101 tomato
102 tomatos
103 tomatoes
104 tomato""")

# replace mystr with 'input.csv'
d = pd.read_csv(mystr, delim_whitespace=True).set_index('Item_ID')['Item_Name'].to_dict()

# create dictionary of results
d_out = {idx: [i, j, SequenceMatcher(None, d[i], d[j]).ratio()] \
              for idx, (i, j) in enumerate(combinations(d, 2))}

# create dataframe from dictionary
res = pd.DataFrame.from_dict(d_out, orient='index')

# rename columns
res.columns = ['Item_ID', 'Item_ID1', 'Similarity']

# output to csv
res.to_csv('result.csv', index=False)

结果:

   Item_ID  Item_ID1  Similarity
0      101       102    0.923077
1      101       103    0.857143
2      101       104    1.000000
3      102       103    0.933333
4      102       104    0.923077
5      103       104    0.857143