python - 遍历字典时缺少键
问题描述
我正在遍历字典列表并创建一个数据框,但是如果缺少键,我就会遇到问题。我可以使用“try:except:”进行异常处理,但是有很多键,我更喜欢使用自定义函数来减少代码量。
顺便说一句,由于我的实际场景中字典列表的复杂性,我不能简单地这样做来创建我的数据框:
# can't do this
df = pd.DataFrame(dict_list)
如果缺少键,示例数据和错误:
dict_list =[{'city':'smithville','zip':1234},{'city':'toonville'}]
df = pd.DataFrame()
for ind,val in enumerate(dict_list):
city = dict_list[ind]['city']
zip = dict_list[ind]['zip']
df1 = pd.DataFrame({'city':[city], 'zip_code':[zip]})
df = pd.concat([df,df1])
错误:
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-52-0c2951af44ad> in <module>
2 for ind,val in enumerate(dict_list):
3 city = dict_list[ind]['city']
----> 4 zip = dict_list[ind]['zip']
5 df1 = pd.DataFrame({'city':[city], 'zip_code':[zip]})
6 df = pd.concat([df,df1])
KeyError: 'zip'
这有效:
df = pd.DataFrame()
for ind,val in enumerate(dict_list):
city = dict_list[ind]['city']
try:
zip = dict_list[ind]['zip']
except:
zip = np.nan
df1 = pd.DataFrame({'city':[city], 'zip_code':[zip]})
df = pd.concat([df,df1])
df
city zip_code
0 smithville 1234.0
0 toonville NaN
我想使用一个函数来完成上述异常处理,但我正在努力解决这个问题。这是我到目前为止所拥有的,但它不起作用:
def get_value(x,y):
try:
x = y
return(x)
except KeyError:
x = np.nan
df = pd.DataFrame()
for ind,val in enumerate(dict_list):
get_value(city,dict_list[ind]['city'])
df1 = pd.DataFrame({'city':[city]})
df = pd.concat([df,df1])
错误
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-67-3a634901ade7> in <module>
1 df = pd.DataFrame()
2 for ind,val in enumerate(dict_list):
----> 3 get_value(city,dict_list[ind]['city'])
4 df1 = pd.DataFrame({'city':[city]})
5 df = pd.concat([df,df1])
NameError: name 'city' is not defined
解决方案
您可以使用dict.get
并提供默认值np.NaN
:
import pandas as pd
import numpy as np
dict_list =[{'city':'smithville','zip':1234},{'city':'toonville'}]
df = pd.DataFrame()
for ind,val in enumerate(dict_list):
city = dict_list[ind].get('city',np.NaN) # get if possible, default to np.NaN
zipp = dict_list[ind].get('zip',np.NaN) # get if possible, default to np.NaN
df1 = pd.DataFrame({'city':[city], 'zip_code':[zipp]})
df = pd.concat([df,df1])
print(df)
输出:
city zip_code
0 smithville 1234.0
0 toonville NaN
不要zip
用作变量,你隐藏了内置的 zip 函数。
推荐阅读
- node.js - 我正在尝试使用其他输入字段在我的 nodejs 应用程序中上传文件,但没有这样做
- r - 在 R 中使用 lapply 时自定义函数返回错误
- javascript - 清除以前的 setInterval 并在单击提交按钮 React.js 时开始新的 Interval
- dns - 如何将 ibm 云应用程序配置到 Godaddy 域
- java - alertDialog中的Listview,将listview定位在我想要的地方就是我卡住的地方
- python - TypeError:预期的二进制或 unicode 字符串,得到项目错误
- javascript - 用于 Javascript 导入对象或函数的 Intellij 调试器控制台
- html - 当网站源中不存在时,R中的抓取表?
- javascript - 无法在 iOS 中获取推荐人
- reactjs - 2021 年 react-native-mapbox-gl 与 react-native-maps