用 NaN 替换字典的空值
Replace empty values of a dictionary with NaN
我有一个缺少值的字典(键在那里,但关联的值是空的)。例如我想要下面的字典:
dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
改成这种形式:
dct = {'ID':NaN, 'gender':'male', 'age':'20', 'weight':NaN, 'height':'5.7'}
我怎样才能以最省时的方式写出来?
你可以使用字典理解。另外正如评论中指出的那样,在 Python 中命名某些东西 dict
不是好的做法。:
dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
dct = {k: None if not v else v for k, v in dct.items() }
print(dct)
输出:
{'ID': None, 'gender': 'male', 'age': '20', 'weight': None, 'height': '5.7'}
只需将 None
替换为您想要的默认值即可。
在您的问题中,您想替换为 NaN
。
您可以使用以下任何一项:
float('nan')
如果您使用 Python 2.x,或者 Python <3.5
math.nan
对于 Python 3.5+
numpy.nan
使用 numpy
您可以对布尔 or
表达式使用隐式语法:
In [1]: dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
In [2]: {k: v or None for k, v in dct.items()}
Out[2]: {'ID': None, 'age': '20', 'gender': 'male', 'height': '5.7', 'weight': None}
但请注意 The Zen of Python 中说:
Explicit is better than implicit.
您可以创建一个 class 对象来表示 NaN
:
class NaN:
def __init__(self, default=None):
self.val = default
def __repr__(self):
return 'NaN'
dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
new_d = {a:NaN() if not b else b for a, b in dct.items()}
输出:
{'gender': 'male', 'age': '20', 'ID': NaN, 'weight': NaN, 'height': '5.7'}
您可以使用 for 循环遍历字典中的所有键和值。
dct = {'ID': '', 'gender': 'male', 'age': '20', 'weight': '', 'height': '5.7'}
for key, value in dct.items():
if value == '':
dct[key] = 'NaN'
print(dct)
- 您使用一系列键值对创建了字典。
- 我使用 for 循环和 .items() 方法迭代字典中的每个键值对。
- 如果 key/value 对的值是一个空字符串,我们将该特定值更改为 'NaN' 并保持其余不变。
当我们打印新字典时,我们得到这个输出:
{'ID': 'NaN', 'gender': 'male', 'age': '20', 'weight': 'NaN', 'height': '5.7'}
这是一个高效的循环,因为它是一个快速循环,只要您同意 'NaN' 值不是字符串即可。我不确定您是否正在寻找它们作为字符串,但是,如果您正在寻找的话,您可以非常简单地将值从 'NaN' 更改为 None。 for 循环在时间方面相对高效,因为它会快速迭代每个值。
我有一个缺少值的字典(键在那里,但关联的值是空的)。例如我想要下面的字典:
dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
改成这种形式:
dct = {'ID':NaN, 'gender':'male', 'age':'20', 'weight':NaN, 'height':'5.7'}
我怎样才能以最省时的方式写出来?
你可以使用字典理解。另外正如评论中指出的那样,在 Python 中命名某些东西 dict
不是好的做法。:
dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
dct = {k: None if not v else v for k, v in dct.items() }
print(dct)
输出:
{'ID': None, 'gender': 'male', 'age': '20', 'weight': None, 'height': '5.7'}
只需将 None
替换为您想要的默认值即可。
在您的问题中,您想替换为 NaN
。
您可以使用以下任何一项:
float('nan')
如果您使用 Python 2.x,或者 Python <3.5
math.nan
对于 Python 3.5+
numpy.nan
使用 numpy
您可以对布尔 or
表达式使用隐式语法:
In [1]: dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
In [2]: {k: v or None for k, v in dct.items()}
Out[2]: {'ID': None, 'age': '20', 'gender': 'male', 'height': '5.7', 'weight': None}
但请注意 The Zen of Python 中说:
Explicit is better than implicit.
您可以创建一个 class 对象来表示 NaN
:
class NaN:
def __init__(self, default=None):
self.val = default
def __repr__(self):
return 'NaN'
dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}
new_d = {a:NaN() if not b else b for a, b in dct.items()}
输出:
{'gender': 'male', 'age': '20', 'ID': NaN, 'weight': NaN, 'height': '5.7'}
您可以使用 for 循环遍历字典中的所有键和值。
dct = {'ID': '', 'gender': 'male', 'age': '20', 'weight': '', 'height': '5.7'}
for key, value in dct.items():
if value == '':
dct[key] = 'NaN'
print(dct)
- 您使用一系列键值对创建了字典。
- 我使用 for 循环和 .items() 方法迭代字典中的每个键值对。
- 如果 key/value 对的值是一个空字符串,我们将该特定值更改为 'NaN' 并保持其余不变。
当我们打印新字典时,我们得到这个输出:
{'ID': 'NaN', 'gender': 'male', 'age': '20', 'weight': 'NaN', 'height': '5.7'}
这是一个高效的循环,因为它是一个快速循环,只要您同意 'NaN' 值不是字符串即可。我不确定您是否正在寻找它们作为字符串,但是,如果您正在寻找的话,您可以非常简单地将值从 'NaN' 更改为 None。 for 循环在时间方面相对高效,因为它会快速迭代每个值。