用NaN替换字典的空值

时间:2018-03-11 21:40:21

标签: python dictionary missing-data

我有一个缺少值的字典(密钥在那里,但关联的值为空)。例如,我想要下面的字典:

dct = {'ID':'', 'gender':'male', 'age':'20', 'weight':'', 'height':'5.7'}

要更改为此格式:

dct = {'ID':NaN, 'gender':'male', 'age':'20', 'weight':NaN, 'height':'5.7'}

我怎样才能以最节省时间的方式写出来?

4 个答案:

答案 0 :(得分:6)

您可以使用词典理解。同样如评论中所述,在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

对于Python 3.5 +

math.nan

numpy.nan使用numpy

答案 1 :(得分:1)

您可以使用带有布尔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中,它说:

  

明确比隐含更好。

答案 2 :(得分:0)

您可以创建一个类对象来表示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'}

答案 3 :(得分:0)

您可以使用for循环迭代Dictionary中的所有键和值。

dct = {'ID': '', 'gender': 'male', 'age': '20', 'weight': '', 'height': '5.7'}


for key, value in dct.items():
      if value == '':
           dct[key] = 'NaN'
print(dct)
  1. 您使用一系列键值对创建了词典。
  2. 我使用for循环和.items()方法迭代字典中的每个键值对。
  3. 如果键/值对的值是空字符串,我们将该特定值更改为' NaN'并保持其余不变。
  4. 当我们打印新词典时,我们得到了这个输出:

    {'ID': 'NaN', 'gender': 'male', 'age': '20', 'weight': 'NaN', 'height': '5.7'}
    
  5. 这是节省时间的,因为它是一个快速循环,只要你没有“NaN'值是字符串。我不确定你是否想要将它们作为字符串,但是,你可以改变NaN'的价值。如果那就是你想要的,那就非常简单。 for循环在时间上相对有效,因为它将快速迭代每个值。