我有一个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之间该单元格的名称。
答案 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