簡體   English   中英

如何計算 Pandas 數據框中一組的每對行之間的函數

[英]How do I calculate a function between each pair of rows of a group in a pandas data frame

我想用組中的所有其他記錄計算一個記錄的函數,然后為每個記錄取最大值。 例如:

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 計算該行值與該組中所有其他行之間的相似性,並將最大值分配給新列 - 這是通過 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM