根据索引和col

时间:2018-06-18 21:36:07

标签: python pandas dataframe fuzzywuzzy

我有一个pandas数据帧,其格式与this question中的格式完全相同,我正在尝试获得相同的结果。就我而言,我正在计算行索引与其对应列之间的fuzz-ratio

如果我尝试此代码(基于链接问题的答案)

def get_similarities(x):
    return x.index + x.name

test_df = test_df.apply(get_similarities)

行索引和列名称的串联按单元格发生,正如预期的那样。按预期运行type(test_df)会返回pandas.core.frame.DataFrame

但是,如果我将代码改编为我的场景,那么

def get_similarities(x):
    return fuzz.partial_ratio(x.index, x.name)

test_df = test_df.apply(get_similarities)

它不起作用。我找回了一个系列(该函数的返回类型是int

而不是数据帧。

我不明白为什么两个样本的行为不一样,也不知道如何修复我的代码,因此它返回一个数据帧,每个单元格的fuzzy.ratio位于该单元格的一行索引和col之间该单元格的名称。

3 个答案:

答案 0 :(得分:1)

以下方法怎么样?

假设我们有两组字符串:

In [245]: set1
Out[245]: ['car', 'bike', 'sidewalk', 'eatery']

In [246]: set2
Out[246]: ['walking', 'caring', 'biking', 'eating']

解决方案:

In [247]: from itertools import product

In [248]: res = np.array([fuzz.partial_ratio(*tup) for tup in product(set1, set2)])

In [249]: res = pd.DataFrame(res.reshape(len(set1), -1), index=set1, columns=set2)

In [250]: res
Out[250]:
          walking  caring  biking  eating
car            33     100       0      33
bike           25      25      75      25
sidewalk       73      20      22      36
eatery         17      33       0      50

答案 1 :(得分:0)

需要一些挖掘,但我想出来了。问题来自这样一个事实:@Id Long id要么按列方式应用,要么逐行应用,而不是逐个单元格应用。因此,您的UserExtra函数实际上一次可以访问整行或一列数据!默认情况下,它会获取整个列 - 因此要解决您的问题,您只需创建一个DataFrame.apply函数,该函数返回一个列表,您可以在每个元素上手动调用get_similarities,如下所示:

get_similarities

我将打印声明留在了他们的内容中,因此您可以看到fuzz.partial_ratio来电为您自己做了什么 - 就在它点击给我的时候。

答案 2 :(得分:0)

有一种方法可以通过DataFrame.apply进行一些行操作来实现这一目的。

假设'test_df`如下:

In [73]: test_df
Out[73]: 
                  walking          caring          biking          eating
car            carwalking       carcaring       carbiking       careating
bike          bikewalking      bikecaring      bikebiking      bikeeating
sidewalk  sidewalkwalking  sidewalkcaring  sidewalkbiking  sidewalkeating
eatery      eaterywalking    eaterycaring    eaterybiking    eateryeating

In [74]: def get_ratio(row):
    ...:     return row.index.to_series().apply(lambda x: fuzz.partial_ratio(x, 
    ...: row.name))
    ...: 

In [75]: test_df.apply(get_ratio)
Out[75]: 
          walking  caring  biking  eating
car            33     100       0      33
bike           25      25      75      25
sidewalk       73      20      22      36
eatery         17      33       0      50