如何计算熊猫数据框中组的每对行之间的函数

Posted

技术标签:

【中文标题】如何计算熊猫数据框中组的每对行之间的函数【英文标题】:How do I calculate a function between each pair of rows of a group in a pandas data frame 【发布时间】:2020-06-27 19:24:32 【问题描述】:

我想为组中的所有其他记录计算一个记录的函数,然后为每条记录取最大值。例如:

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 之间的相似性,并将最大值作为第二行的新列,依此类推,为每组产品,城市。

【问题讨论】:

您能否更具体地阐明您希望该功能做什么?字符串值似乎也是您想要的最大值,所以我不清楚您从问题的相似性/最大值部分想要什么。也许如果您玩一些字符串/值的实际示例会有所帮助。 我想计算这些字符串之间的相似度,并选择与特定行中的值最相似的那个 你如何给相似度打分?例如。 “abc”与“abd”或“abcd”最相似,“abc”与“aabc”或“abcc”最相似吗? 【参考方案1】:

试试这个:

基本上,我们循环遍历每个组中的每一行,并使用 SequenceMatcher 计算该行的值与该组中的所有其他行之间的相似性,并将最大值分配给新列 - 这是通过 2 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

【讨论】:

以上是关于如何计算熊猫数据框中组的每对行之间的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何使函数在熊猫中对行进行迭代?

如何将函数应用于增加数据框中的数据子集

在熊猫数据框中计算速度的函数

计算 SQL 中组的重叠时间(以秒为单位)

计算熊猫数据框中kmeans的损失函数

如何计算熊猫数据框中每一列的唯一性?