如何对照数据帧的列本身检查数据帧的列?

2024-10-03 02:36:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含两个相关列的数据帧。我需要对照列A(一个名称列表)本身进行检查,如果两个(或更多)值彼此足够相似,我将对这些行的列B中的值求和。 为了检查相似性,我使用fuzzyfuzzy包,它接受两个字符串并返回一个分数。你知道吗

数据:

a            b   
apple        3 
orang        4 
aple         1  
orange       10  
banana       5

我想留下:

a       b
apple   4
orang   14
banana  5

我试过下面这句话,但我一直得到一个关键错误

    df['b']=df.apply(lambda x: df.loc[fuzz.ratio(df.a,x.a)>=70,'b'].sum(), axis=1)

我还需要删除将列b添加到另一行的所有行。你知道吗

你对如何做到这一点有什么想法吗?你知道吗


Tags: 数据字符串名称appledf列表错误相似性
2条回答

这里的某些部分最好用pandas来完成,而有些部分(例如,应用于笛卡尔积的函数)可以不用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()

相关问题 更多 >