【问题标题】:drop a dictionary with nan value删除具有 nan 值的字典
【发布时间】:2022-11-25 21:17:27
【问题描述】:

我有以下字典:

my_dict = {'fields': ['id': 1.0,
  'name': 'aaa',
  'type': 'string'},
 {'id': 3.0,
  'name': 'eee',
  'type': 'string'},

 {'id': nan,
  'name': 'bbb',
  'type': 'string'},

 {'id': 4.0,
  'name': 'ccc',
  'type': 'string'},

 {'id': nan,
  'name': 'ddd',
  'type': 'string'}],

'type': 'struct'
}

从这本词典中,我想删除带有 idnan 值的词典,并希望获得以下内容。

my_updated_dict = {'fields': ['id': 1.0,
  'name': 'aaa',
  'type': 'string'},

 {'id': 3.0,
  'name': 'eee',
  'type': 'string'},

 {'id': 4.0,
  'name': 'ccc',
  'type': 'string'}],

'type': 'struct'
}

我正在尝试更改为数据框并将 id 值与 nan 值一起删除并更改为字典,但无法获得预期结果。

 my_updated_dict = pd.DataFrame(my_dict ).dropna().to_dict('list')

【问题讨论】:

    标签: python pandas numpy dictionary nan


    【解决方案1】:

    我不知道如果你可以简单地做,你为什么需要熊猫:

    my_dict["fields"] = [i for i in my_dict["fields"] if not np.isnan(i["id"])]
    

    ** 更新 **

    如果你真的出于某种原因确实需要使用熊猫,你可以试试这个结构:

    my_dict["fields"] = pd.Series(my_dict["fields"]).apply(pd.Series).dropna().to_dict(orient="records")
    

    尽管我看不出比简单的列表理解有任何优势,除了可能涉及大量信息。

    【讨论】:

    • 这是np.nan
    • 固定答案
    【解决方案2】:

    你可以使用update()来覆盖key的值,那么你可以试试:

    my_dict.update({'fields':[x for x in my_dict['fields'] if np.nan not in x.values()]})
    

    返回:

    {'fields': [{'id': 1.0, 'name': 'aaa', 'type': 'string'},
      {'id': 3.0, 'name': 'eee', 'type': 'string'},
      {'id': 4.0, 'name': 'ccc', 'type': 'string'}],
     'type': 'struct'}
    

    【讨论】:

    • 它可能不是一个字符串。
    • 谢谢,修复它以解决它。
    【解决方案3】:

    考虑字典json

    import numpy as np
    
    json = {'fields': [{'id': 1.0, 'name': 'aaa', 'type': 'string'},
                         {'id': 3.0, 'name': 'eee', 'type': 'string'},
                            {'id': np.nan, 'name': 'bbb', 'type': 'string'},
                                {'id': 4.0, 'name': 'ccc', 'type': 'string'},
                                    {'id': np.nan, 'name': 'ddd', 'type': 'string'}],
                                        'type': 'struct'}
    

    为了删除idnp.nan的部分,可以使用numpy.isnan的列表理解,如下所示

    json['fields'] = [x for x in json['fields'] if not np.isnan(x['id'])]
    
    [Out]:
    
    {'fields': [{'id': 1.0, 'name': 'aaa', 'type': 'string'},
                {'id': 3.0, 'name': 'eee', 'type': 'string'},
                {'id': 4.0, 'name': 'ccc', 'type': 'string'}],
     'type': 'struct'}
    

    【讨论】: