Python 仅获取模糊比率高于给定值的那些行的列平均值

Python 仅获取模糊比率高于给定值的那些行的列平均值,python,pandas,pandas-groupby,fuzzy-search,fuzzy-logic,Python,Pandas,Pandas Groupby,Fuzzy Search,Fuzzy Logic,我试图为一列中的每个值获取另一列的平均值,该列的fuzz.partial_ratio()高于给定限制的行中只有1和0(例如高于80) 我知道这可能不清楚,所以这里是我的数据示例 col1 col2 col3 A Miami 1 A Miami 0 A Miami. 0 A Barcelona 0 A Barc elona 0 A Shanghai 1 A Shangai 0 B Mia

我试图为一列中的每个值获取另一列的平均值,该列的
fuzz.partial_ratio()
高于给定限制的行中只有1和0(例如高于80)

我知道这可能不清楚,所以这里是我的数据示例

col1 col2      col3
A    Miami       1
A    Miami       0
A    Miami.      0
A    Barcelona   0
A    Barc elona  0
A    Shanghai    1
A    Shangai     0
B    Miami       1
B    Miami       1
B    Miami.      1
B    Barcelona   0
B    Barc elona  0
B    Shanghai    1
B    Shangai    0
我正在尝试
groupby('col1')
,并且对于
col2
中的每个值,在一个新列中仅估计
col3
的平均值,其中
col2
fuzzy\u比率
高于80

例如,在
0
行中,
df['col2']='Miami'
。然后,我想用
col2
with
df['col1']='A'
中的所有值获得'Miami'的
fuzzy_ratio()
,并获得比率>80的行的
col3
的平均值,并将其存储在新列中。这将是行
1
2
,即0。行
2
相同,但在这种情况下,平均值将为0.5

我试图获得的输出如下所示:

col1 col2      col3 col4
A    Miami       1   0.33
A    Miami       0   0.33
A    Miami.      0   0.33
A    Barcelona   0   0
A    Barc elona  0   0
A    Shanghai    1   0.5
A    Shangai     0   0.5
B    Miami       1   1
B    Miami       1   1
B    Miami.      1   1
B    Barcelona   0   0
B    Barc elona  0   0
B    Shanghai    1   0.5
B    Shangai     0   0.5
我设法为
col2
中的每个值使用
for
循环,但我有一个相对较大的数据集(+1000万行),这将花费很长时间

有什么方法可以避免
循环执行此任务


非常感谢

这效率不高,但我认为可以满足您的需要

from fuzzywuzzy import fuzz
import pandas as pd
import numpy as np

# helper function
def remove_element(lst, index):
    "Removes an element from a list based on the index"
    tmp = lst.copy()
    del tmp[index]
    return tmp


df = pd.DataFrame({'col1':['A', 'A', 'A', 'A', 'A', 'A', 'A', 
                           'B', 'B', 'B', 'B', 'B', 'B', 'B'], 
                  'col2':['Miami', 'Miami', 'Miami.', 'Barcelona', 'Barc elona', 
                         'Shanghai', 'Shangai', 'Miami', 'Miami', 'Miami.', 
                         'Barcelona', 'Barc elona', 'Shanghai', 'Shangai'], 
                  'col3':[1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0]})

# create a column that indicates the index of the element within the group
df['col2_index'] = 1
df['col2_index'] = df.groupby('col1')['col2_index'].cumsum() - 1

# create a list of the elements within the group
df['col2_list'] = df['col1'].map(df.groupby('col1')['col2'].apply(list))
df['col3_list'] = df['col1'].map(df.groupby('col1')['col3'].apply(list))

# remove the element associated with col2 and col3 respectively
df['col2_list'] = df.apply(lambda x: remove_element(x['col2_list'], x['col2_index']), axis=1)
df['col3_list'] = df.apply(lambda x: remove_element(x['col3_list'], x['col2_index']), axis=1)

# apply the threshold of 80 for the partial_ratio
df['key'] = df.apply(lambda x: 
         np.array([fuzz.partial_ratio(x['col2'], el) for el in x['col2_list']]) >= 80, axis=1)

# get the average of col3 for those that pass the threshold
df['result'] = df.apply(lambda x: np.mean(np.array(x['col3_list'])[x['key']]), axis=1)

df

对于更新后的问题,只需删除细化列表的代码部分

df = pd.DataFrame({'col1':['A', 'A', 'A', 'A', 'A', 'A', 'A', 
                           'B', 'B', 'B', 'B', 'B', 'B', 'B'], 
                  'col2':['Miami', 'Miami', 'Miami.', 'Barcelona', 'Barc elona', 
                         'Shanghai', 'Shangai', 'Miami', 'Miami', 'Miami.', 
                         'Barcelona', 'Barc elona', 'Shanghai', 'Shangai'], 
                  'col3':[1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0]})


df['col2_list'] = df['col1'].map(df.groupby('col1')['col2'].apply(list))
df['col3_list'] = df['col1'].map(df.groupby('col1')['col3'].apply(list))

df['key'] = df.apply(lambda x: 
         np.array([fuzz.partial_ratio(x['col2'], el) for el in x['col2_list']]) >= 80, axis=1)

df['result'] = df.apply(lambda x: np.mean(np.array(x['col3_list'])[x['key']]), axis=1)

df


为什么col4的第一个值与第二个值不同?它们都是miami,因为它正在计算剩余的平均值,不包括行
0
。然而,另一种方法也适用于我正在寻找的东西,而且它显然更简单,所以我将改变它。谢谢,谢谢!!!事实上,这需要永远,但它的工作,这是更好的方式比我有!
df = pd.DataFrame({'col1':['A', 'A', 'A', 'A', 'A', 'A', 'A', 
                           'B', 'B', 'B', 'B', 'B', 'B', 'B'], 
                  'col2':['Miami', 'Miami', 'Miami.', 'Barcelona', 'Barc elona', 
                         'Shanghai', 'Shangai', 'Miami', 'Miami', 'Miami.', 
                         'Barcelona', 'Barc elona', 'Shanghai', 'Shangai'], 
                  'col3':[1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 0]})


df['col2_list'] = df['col1'].map(df.groupby('col1')['col2'].apply(list))
df['col3_list'] = df['col1'].map(df.groupby('col1')['col3'].apply(list))

df['key'] = df.apply(lambda x: 
         np.array([fuzz.partial_ratio(x['col2'], el) for el in x['col2_list']]) >= 80, axis=1)

df['result'] = df.apply(lambda x: np.mean(np.array(x['col3_list'])[x['key']]), axis=1)

df

  col1  col2     col3   col2_list                                           col3_list               key                                             result
0   A   Miami       1   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 0, 0, 0, 0, 1, 0]   [True, True, True, False, False, False, False]  0.333333
1   A   Miami       0   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 0, 0, 0, 0, 1, 0]   [True, True, True, False, False, False, False]  0.333333
2   A   Miami.      0   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 0, 0, 0, 0, 1, 0]   [True, True, True, False, False, False, False]  0.333333
3   A   Barcelona   0   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 0, 0, 0, 0, 1, 0]   [False, False, False, True, True, False, False] 0.000000
4   A   Barc elona  0   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 0, 0, 0, 0, 1, 0]   [False, False, False, True, True, False, False] 0.000000
5   A   Shanghai    1   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 0, 0, 0, 0, 1, 0]   [False, False, False, False, False, True, True] 0.500000
6   A   Shangai     0   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 0, 0, 0, 0, 1, 0]   [False, False, False, False, False, True, True] 0.500000
7   B   Miami       1   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 1, 1, 0, 0, 1, 0]   [True, True, True, False, False, False, False]  1.000000
8   B   Miami       1   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 1, 1, 0, 0, 1, 0]   [True, True, True, False, False, False, False]  1.000000
9   B   Miami.      1   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 1, 1, 0, 0, 1, 0]   [True, True, True, False, False, False, False]  1.000000
10  B   Barcelona   0   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 1, 1, 0, 0, 1, 0]   [False, False, False, True, True, False, False] 0.000000
11  B   Barc elona  0   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 1, 1, 0, 0, 1, 0]   [False, False, False, True, True, False, False] 0.000000
12  B   Shanghai    1   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 1, 1, 0, 0, 1, 0]   [False, False, False, False, False, True, True] 0.500000
13  B   Shangai     0   [Miami, Miami, Miami., Barcelona, Barc elona, ...   [1, 1, 1, 0, 0, 1, 0]   [False, False, False, False, False, True, True] 0.500000