如何检查 Pandas DataFrame 的列自身?
How can I check a Pandas DataFrame's column against itself?
我有一个包含两个相关列的 Pandas DataFrame。我需要对照自身检查 A 列(名称列表),如果两个(或更多)值彼此足够相似,我将这些行的 B 列中的值相加。
为了检查相似性,我使用了接受两个字符串和 returns 分数的 FuzzyWuzzy 包。
数据:
a b
apple 3
orang 4
aple 1
orange 10
banana 5
我想留下:
a b
apple 4
orang 14
banana 5
我尝试了以下行,但我一直收到 KeyError
df['b']=df.apply(lambda x: df.loc[fuzz.ratio(df.a,x.a)>=70,'b'].sum(), axis=1)
我还需要删除所有将 b 列添加到另一行的行。
对如何实现这一点有什么想法吗?
此处的某些部分最好用 pandas 完成,而某些部分(例如,应用于笛卡尔积的函数)可以不用它来完成。
总的来说,您可以使用:
import itertools
import numpy as np
alias = {l : r for l, r in itertools.product(df.a, df.a) if l < r and
fuzz.ratio(l, r) > 70}
>>> df.b.groupby(df.a.replace(alias)).sum()
apple 4
banana 5
orange 14
Name: b, dtype: int64
行
alias = {l : r for l, r in itertools.product(df.a, df.a) if l < r and
fuzz.ratio(l, r) > 70}
创建映射 alias
,将词从 a
映射到它们的别名。
行
df.b.groupby(df.a.replace(alias)).sum()
通过使用 alias
的翻译对 b
进行分组,然后求和。
我会映射和分组:
def get_similarity(df, ind, col):
mapped = list(map(lambda x: fuzz.ratio(x, df[col].loc[ind]), df[col]))
cond = (np.array(mapped) >= 70)
label = df[col][cond].iloc[0]
return label
并像这样使用:
df.groupby(lambda x: get_similarity(df, x, 'a'))['b'].sum()
我有一个包含两个相关列的 Pandas DataFrame。我需要对照自身检查 A 列(名称列表),如果两个(或更多)值彼此足够相似,我将这些行的 B 列中的值相加。 为了检查相似性,我使用了接受两个字符串和 returns 分数的 FuzzyWuzzy 包。
数据:
a b
apple 3
orang 4
aple 1
orange 10
banana 5
我想留下:
a b
apple 4
orang 14
banana 5
我尝试了以下行,但我一直收到 KeyError
df['b']=df.apply(lambda x: df.loc[fuzz.ratio(df.a,x.a)>=70,'b'].sum(), axis=1)
我还需要删除所有将 b 列添加到另一行的行。
对如何实现这一点有什么想法吗?
此处的某些部分最好用 pandas 完成,而某些部分(例如,应用于笛卡尔积的函数)可以不用它来完成。
总的来说,您可以使用:
import itertools
import numpy as np
alias = {l : r for l, r in itertools.product(df.a, df.a) if l < r and
fuzz.ratio(l, r) > 70}
>>> df.b.groupby(df.a.replace(alias)).sum()
apple 4
banana 5
orange 14
Name: b, dtype: int64
行
alias = {l : r for l, r in itertools.product(df.a, df.a) if l < r and
fuzz.ratio(l, r) > 70}
创建映射 alias
,将词从 a
映射到它们的别名。
行
df.b.groupby(df.a.replace(alias)).sum()
通过使用 alias
的翻译对 b
进行分组,然后求和。
我会映射和分组:
def get_similarity(df, ind, col):
mapped = list(map(lambda x: fuzz.ratio(x, df[col].loc[ind]), df[col]))
cond = (np.array(mapped) >= 70)
label = df[col][cond].iloc[0]
return label
并像这样使用:
df.groupby(lambda x: get_similarity(df, x, 'a'))['b'].sum()