我有一个熊猫DataFrame,它看起来像:
ID | StateName | ZipCode
____________________________________
0 MD 20814
1 90210
2 DC 20006
3 05777
4 12345
我有一个根据ZipCode值填充StateName的函数:
def FindZip(x):
search = ZipcodeSearchEngine()
zipcode = search.by_zipcode(x)
return zipcode['State']
我想根据相应ZipCode的值来填充StateName列中的空格。我已经尝试过了,但没有成功:
test['StateName'] = test['StateName'].apply(lambda x: FindZip(test['Zip_To_Use']) if x == "" else x)
基本上,我希望将函数应用于与我试图更改的列不同的列。如果有任何帮助,我将不胜感激!谢谢!
发布于 2017-12-20 01:18:14
您可以尝试执行以下操作:
test['StateName'] = test.apply(lambda x: FindZip(test['Zip_To_Use'])
if x['StateName'] == ""
else x['StateName'], axis = 1)
上面的代码适用于dataframe,而不是StateName
,并使用axis = 1
,适用于列。
更新:
在if
语句中更新了多个条件(查看下面的解决方案):
test['StateName'] = test.apply(lambda x: FindZip(test['Zip_To_Use'])
if ((x['StateName'] == "") and (x['Zip_To_Use'] != ""))
else x['StateName'], axis = 1)
发布于 2017-12-20 15:57:28
我想出了一个不太“可爱”的变通办法。如果有人有想法的话,我仍然希望看到一个更"pythonic“或"pandorable”的解决方案!实际上,我创建了一个与DataFrame
长度相同的新列表,遍历每一行,然后用新列表覆盖列。
state = [FindState(test['Zip_To_Use'].iloc[i]) if (test['StateName'].iloc[i] == "" and test['Zip_To_Use'].iloc[i] != "")
else test['StateName'].iloc[i] for i in range(len(test))]
在常规的for循环中重新声明(为了可读性):
state = []
for i in range(len(test)):
if (test['StateName'].iloc[i] == "" and test['Zip_To_Use'].iloc[i] != ""):
state.append(FindState(test['Zip_To-Use'].iloc[i]))
else:
state.append(test['StateName'].iloc[i])
,然后用这个新列表重新分配列。
test['StateName'] = state
如果你有更好的解决方案,请告诉我!
https://stackoverflow.com/questions/47897401
复制