Python 如何计算数据帧中组的每对行之间的函数

Python 如何计算数据帧中组的每对行之间的函数,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我想计算一个记录的一个函数,在一个组中每隔一个记录计算一个函数,然后取每个记录的最大值。例如: product, city, value a, 1, str1 a, 1, str2 a, 1, str3 a, 2, str4 a, 2, str5 a, 2, str6 假设我的函数正在计算字符串中的相似性,那么我想计算str1、str2和str1、str3之间的相似性,并将最大值作为第一行的新列。str2、str1和str2、str3之间的相似性,并将最大值作为第二行的新列,依此类推,适用于每

我想计算一个记录的一个函数,在一个组中每隔一个记录计算一个函数,然后取每个记录的最大值。例如:

product, city, value
a, 1, str1
a, 1, str2
a, 1, str3
a, 2, str4
a, 2, str5
a, 2, str6
假设我的函数正在计算字符串中的相似性,那么我想计算str1、str2和str1、str3之间的相似性,并将最大值作为第一行的新列。str2、str1和str2、str3之间的相似性,并将最大值作为第二行的新列,依此类推,适用于每个产品组、城市。

尝试以下方法:

基本上,我们在每个组中的每一行中循环,并使用SequenceMatcher计算该行的值与该组中所有其他行之间的相似性,并将最大值分配给新列-这是通过两个lambda函数实现的-一个用于外循环,另一个用于内循环

df = pd.DataFrame([['a', 1, 'str1'],
                   ['a', 1, 'st2'],
                   ['a', 1, 'str3'],
                   ['a', 1, 'str10'],
                   ['a', 2, 'str4'],
                   ['a', 2, 'str5'],
                   ['a', 2, 'str6']],
                  columns=['product', 'city', 'value'])

def func(grp):
    def match(id, val):    
        matches = grp.drop(id).apply(lambda x: difflib.SequenceMatcher(None, x['value'], val).ratio(), axis=1)
        return max([x for i, x in enumerate(matches) if x])

    return grp.apply(lambda row: match(row.name, row['value']), axis=1)


res = df.groupby(['product', 'city']).apply(func).reset_index()
res['level_2'] = df['value']
res.rename(columns={'level_2':'value'}, inplace=True)

print(res)
输出:

  product  city  value         0
0       a     1   str1  0.888889
1       a     1    st2  0.571429
2       a     1   str3  0.750000
3       a     1  str10  0.888889
4       a     2   str4  0.750000
5       a     2   str5  0.750000
6       a     2   str6  0.750000

你能澄清一下你想让这个函数具体做什么吗?字符串值似乎也是您希望最大值的值,因此我不清楚您希望从问题的相似度/最大值部分得到什么。如果你玩一些字符串/值的实际例子,可能会有所帮助。我想计算这些字符串之间的相似性,并选择一个与特定行中的值最相似的字符串。你如何计算相似性?例如,“abc”是否与“abd”或“abcd”最相似,“abc”是否与“aabc”或“abcc”最相似?