[英]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.