Python Pandas-在applymap期间检索每个元素的行和列名

Python Pandas-在applymap期间检索每个元素的行和列名,python,pandas,Python,Pandas,我试图比较两个字符串列表的相似性,并将它们显示在一个数据框中以供检查;所以我使用1个列表作为索引,另一个作为列列表。然后我想计算它们的“Levenshtein相似度”(一个比较两个单词之间相似度的函数) 我试图通过使用apply map实现这一点,它将进入每个单元格,并将单元格索引与单元格列进行比较。但我怎么能做到呢?或者也许会有更简单的方法 things = ['car', 'bike', 'sidewalk', 'eatery'] action = ['walking', 'caring',

我试图比较两个字符串列表的相似性,并将它们显示在一个数据框中以供检查;所以我使用1个列表作为索引,另一个作为列列表。然后我想计算它们的“Levenshtein相似度”(一个比较两个单词之间相似度的函数)

我试图通过使用apply map实现这一点,它将进入每个单元格,并将单元格索引与单元格列进行比较。但我怎么能做到呢?或者也许会有更简单的方法

things = ['car', 'bike', 'sidewalk', 'eatery']
action = ['walking', 'caring', 'biking', 'eating']
matrix = pd.DataFrame(index = things, columns = action)

def lev(x):
    x = Levenshtein.distance(x.index, x.column)  
matrix.applymap(lev)
到目前为止,我使用了下面的方法,但我发现它既笨拙又缓慢

matrix = pd.DataFrame(data = [action for i in things], index = things, columns = action)
for i, values in matrix.iterrows():
    for j, value in enumerate(values):
        matrix.ix[i,j] = Levenshtein.distance(i, value) 
我认为您可以使用和作为列值使用
。name

def lev(x):
    #replace your function
    return x.index + x.name
a = matrix.apply(lev)
print (a)
                  walking          caring          biking          eating
car            carwalking       carcaring       carbiking       careating
bike          bikewalking      bikecaring      bikebiking      bikeeating
sidewalk  sidewalkwalking  sidewalkcaring  sidewalkbiking  sidewalkeating
eatery      eaterywalking    eaterycaring    eaterybiking    eateryeating
编辑:

如果需要一些算术运算,请使用:

或:

您可以通过“嵌套
apply
”执行此操作,如下所示:

things = ['car', 'bike', 'sidewalk', 'eatery']
action = ['walking', 'caring', 'biking', 'eating']
matrix = pd.DataFrame(index=things, columns=action)
matrix.apply(lambda x: pd.DataFrame(x).apply(lambda y: LD(x.name, y.name), axis=1))
输出:

          walking  caring  biking  eating
car             6       3       6       5
bike            6       5       3       5
sidewalk        7       8       7       8
eatery          6       5       6       3

这里调用
pd.DataFrame(x)
是因为
x
是一个
Series
对象,
Series.apply
类似于
applymap
,它不携带
索引
信息。

。但是,如果有一个矢量化/元素化的操作,是否就没有办法实现这一点?你所做的基本上就是我用它所做的事情,这取决于你需要什么。如果只需要一些算术运算,请使用numpy。我明白了,谢谢,但我不是在做算术运算,而是像问题中那样对每个单元格应用一个简单的函数。我认为applymap,作为一个元素方法就可以了。是的,但是它与
applymap
中的索引和列值没有关系-通过
a.applymap(lambda x:print(x))
检查它,所以我知道我无论如何都必须使用apply/iterrows进行迭代。有点失望,但是太赫兹
things = ['car', 'bike', 'sidewalk', 'eatery']
action = ['walking', 'caring', 'biking', 'eating']
matrix = pd.DataFrame(index=things, columns=action)
matrix.apply(lambda x: pd.DataFrame(x).apply(lambda y: LD(x.name, y.name), axis=1))
          walking  caring  biking  eating
car             6       3       6       5
bike            6       5       3       5
sidewalk        7       8       7       8
eatery          6       5       6       3