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
-它返回列表的第一个值,如果存在(如果不是空列表),则返回默认值,此处为空字符串