如何检查Pandas DataFrame的列?

时间:2018-03-18 02:28:22

标签: python pandas dataframe fuzzywuzzy

我有一个带有两个相关列的Pandas DataFrame。我需要检查列A(名称列表)与自身,如果两个(或更多)值彼此足够相似,我将列B中的值与这些行相加。 为了检查相似性,我使用了FuzzyWuzzy包,它接受两个字符串并返回一个分数。

数据:

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)

我尝试了以下这一行,但我一直得到一个KeyError

{{1}}

我还需要删除列b添加到另一行的所有行。

关于如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:0)

这里的一些部分最好用大熊猫完成,有些部分(例如,应用于笛卡尔积的函数)可以在没有它的情况下完成。

总的来说,你可以这样做:

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()

使用b通过翻译对alias进行分组,然后汇总。

答案 1 :(得分:0)

我会映射和分组:

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()
相关问题