Python Difflib应用于dataframe中的两列时出错

Python Difflib应用于dataframe中的两列时出错,python,pandas,difflib,Python,Pandas,Difflib,我的数据框架如下所示: Cities Cities_Dict "San Francisco" ["San Francisco", "New York", "Boston"] "Los Angeles" ["Los Angeles"] "berlin" ["Munich", "Berlin"] "Dubai" ["Dubai"] 我想创建一个新列,将firest列中的城市与secon列中的城市列表进行比较,并找到最匹配的城市。 为此,我使用了dif

我的数据框架如下所示:

Cities        Cities_Dict
"San Francisco" ["San Francisco", "New York", "Boston"]
"Los Angeles"   ["Los Angeles"]
"berlin"        ["Munich", "Berlin"]
"Dubai"         ["Dubai"]
我想创建一个新列,将firest列中的城市与secon列中的城市列表进行比较,并找到最匹配的城市。 为此,我使用了
difflib

df["new_col"]=difflib.get_close_matches(df["Cities"],df["Cities_Dict"])
但是我得到了一个错误:

TypeError: object of type 'float' has no len()
与lambda函数和轴=1一起使用,按行处理:

import difflib, ast

#if necessary convert values to lists
#df['Cities_Dict'] = df['Cities_Dict'].apply(ast.literal_eval)

f = lambda x: difflib.get_close_matches(x["Cities"],x["Cities_Dict"])
df["new_col"] = df.apply(f, axis=1)
print (df)
          Cities                        Cities_Dict          new_col
0  San Francisco  [San Francisco, New York, Boston]  [San Francisco]
1    Los Angeles                      [Los Angeles]    [Los Angeles]
2         berlin                   [Munich, Berlin]         [Berlin]
3          Dubai                            [Dubai]          [Dubai]
编辑:

对于空列表的第一个空字符串值,请使用:

f = lambda x: next(iter(difflib.get_close_matches(x["Cities"],x["Cities_Dict"])), '')
df["new_col"] = df.apply(f, axis=1)
print (df)
          Cities                        Cities_Dict        new_col
0  San Francisco  [San Francisco, New York, Boston]  San Francisco
1    Los Angeles                      [Los Angeles]    Los Angeles
2         berlin                   [Munich, Berlin]         Berlin
3          Dubai                            [Dubai]          Dubai
EDIT1:如果可能存在问题数据,请使用
尝试除此之外的其他方法

def f(x):
    try:
        return difflib.get_close_matches(x["Cities"],x["Cities_Dict"])[0]
    except:
        return ''

df["new_col"] = df.apply(f, axis=1)
print (df)
        Cities                        Cities_Dict new_col
0          NaN  [San Francisco, New York, Boston]        
1  Los Angeles                               [10]        
2       berlin                   [Munich, Berlin]  Berlin
3        Dubai                            [Dubai]   Dubai

是否可以将结果不是列表而是字符串?@AlexT-答案已编辑-始终返回列表或空字符串的第一个值我发现Cities中的某些值以浮点或整数结尾,是否可以使用try,除了lambda函数中会跳过这些行并为它们生成空字符串之外?还有第二个问题,为什么要使用next和iter?@AlexT-对于第一个问题,答案被编辑。第二,这是一个技巧-这里的问题是使用
[0]
选择列表的第一个值,因为如果列表为空,它将返回错误-例如
L=['Dubai']
L[0]
工作,但如果
L=[]
L[0]
失败。对于防止失败,使用
next
iter
-它返回列表的第一个值,如果存在(如果不是空列表),则返回默认值,此处为空字符串