从字典的 defaultdict(list) 中删除 nan 值
remove nan values from defaultdict(list) of dicts
我从 运行 一些分析中创建了以下代码,并将结果放入 defaultdict(list) 中。之后我将结果放入一个 csv 文件中。首先,我想删除 Check2
中包含 'nan' 值的项目
如何删除字典列表中的值?
from numpy import nan
from collections import defaultdict
d = defaultdict(list,
{'Address_1': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1' : 8,
'Check2' : 1},
{'Name': 'name',
'Address_match': 'address_match_2',
'ID': 'id',
'Type': 'abc',
'Check1' : 20,
'Check2' : nan},
{'Name': 'name',
'Address_match': 'address_match_3',
'ID': 'id',
'Type': 'abc',
'Check1' : 27,
'Check2' : nan}],
'Address_2': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1' : 30,
'Check2' : 1},
{'Name': 'name',
'Address_match': 'address_match_2',
'ID': 'id',
'Type': 'abc',
'Check1' : 38,
'Check2' : nan},
{'Name': 'name',
'Address_match': 'address_match_3',
'ID': 'id',
'Type': 'abc',
'Check1' : 12,
'Check2' : nan}]})
之后我的结果应该是:
d = defaultdict(list,
{'Address_1': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1' : 8,
'Check2' : 1}],
'Address_2': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1' : 30,
'Check2' : 1}
]})
你可以这样做:
import math
def remove_nan_att(d, att):
return {key: [o for o in d[key] if not math.isnan(o[att])] for key in d}
d = remove_nan_att(d, 'Check2')
遍历字典,对于每个键,遍历其列表并按所需属性过滤 nan 值。
如果 nan
来自 numpy:
from numpy import nan
def remove_nan_att(d, att):
return {key: [o for o in d[key] if not o[att] is nan] for key in d}
d = remove_nan_att(d, 'Check2')
如果您不想将其用作函数:
att = 'Check2'
d = {key: [o for o in d[key] if not o[att] is nan] for key in d}
尝试:
df = pd.DataFrame.from_records(d).unstack()
d = df[df.str['Check2'].notna()].unstack(level=0).to_dict('list')
print(d)
# Output:
{'Address_1': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 8,
'Check2': 1}],
'Address_2': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 30,
'Check2': 1}]}
更新
你可以简单地使用双重理解:
d = [{k: [v for v in l if pd.notna(v['Check2'])]} for k, l in d.items()]
print(d)
# Output:
[{'Address_1': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 8,
'Check2': 1}]},
{'Address_2': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 30,
'Check2': 1}]}]
为了更容易理解,这里是正常循环的版本:
data = defaultdict(list)
for k, l in d.items(): # for each key in d (Address_1, Address_2, ...)
for v in l: # for each record in key {'Name': ...}
if pd.notna(v['Check2']): # check the condition
data[k].append(v) # append to the dict
您可以使用 dict comprehension + filter(它是在 d
中的每个列表中过滤 Check2
不是 np.nan
的词典):
out = {k: list(filter(lambda x: ~np.isnan(x['Check2']), lst)) for k, lst in d.items()}
您可以使用字典理解 + 列表理解来做同样的事情:
out = {k: [dct for dct in lst if not np.isnan(dct['Check2'])] for k, lst in d.items()}
输出:
{'Address_1': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 8,
'Check2': 1}],
'Address_2': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 30,
'Check2': 1}]}
我从 运行 一些分析中创建了以下代码,并将结果放入 defaultdict(list) 中。之后我将结果放入一个 csv 文件中。首先,我想删除 Check2
中包含 'nan' 值的项目如何删除字典列表中的值?
from numpy import nan
from collections import defaultdict
d = defaultdict(list,
{'Address_1': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1' : 8,
'Check2' : 1},
{'Name': 'name',
'Address_match': 'address_match_2',
'ID': 'id',
'Type': 'abc',
'Check1' : 20,
'Check2' : nan},
{'Name': 'name',
'Address_match': 'address_match_3',
'ID': 'id',
'Type': 'abc',
'Check1' : 27,
'Check2' : nan}],
'Address_2': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1' : 30,
'Check2' : 1},
{'Name': 'name',
'Address_match': 'address_match_2',
'ID': 'id',
'Type': 'abc',
'Check1' : 38,
'Check2' : nan},
{'Name': 'name',
'Address_match': 'address_match_3',
'ID': 'id',
'Type': 'abc',
'Check1' : 12,
'Check2' : nan}]})
之后我的结果应该是:
d = defaultdict(list,
{'Address_1': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1' : 8,
'Check2' : 1}],
'Address_2': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1' : 30,
'Check2' : 1}
]})
你可以这样做:
import math
def remove_nan_att(d, att):
return {key: [o for o in d[key] if not math.isnan(o[att])] for key in d}
d = remove_nan_att(d, 'Check2')
遍历字典,对于每个键,遍历其列表并按所需属性过滤 nan 值。
如果 nan
来自 numpy:
from numpy import nan
def remove_nan_att(d, att):
return {key: [o for o in d[key] if not o[att] is nan] for key in d}
d = remove_nan_att(d, 'Check2')
如果您不想将其用作函数:
att = 'Check2'
d = {key: [o for o in d[key] if not o[att] is nan] for key in d}
尝试:
df = pd.DataFrame.from_records(d).unstack()
d = df[df.str['Check2'].notna()].unstack(level=0).to_dict('list')
print(d)
# Output:
{'Address_1': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 8,
'Check2': 1}],
'Address_2': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 30,
'Check2': 1}]}
更新
你可以简单地使用双重理解:
d = [{k: [v for v in l if pd.notna(v['Check2'])]} for k, l in d.items()]
print(d)
# Output:
[{'Address_1': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 8,
'Check2': 1}]},
{'Address_2': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 30,
'Check2': 1}]}]
为了更容易理解,这里是正常循环的版本:
data = defaultdict(list)
for k, l in d.items(): # for each key in d (Address_1, Address_2, ...)
for v in l: # for each record in key {'Name': ...}
if pd.notna(v['Check2']): # check the condition
data[k].append(v) # append to the dict
您可以使用 dict comprehension + filter(它是在 d
中的每个列表中过滤 Check2
不是 np.nan
的词典):
out = {k: list(filter(lambda x: ~np.isnan(x['Check2']), lst)) for k, lst in d.items()}
您可以使用字典理解 + 列表理解来做同样的事情:
out = {k: [dct for dct in lst if not np.isnan(dct['Check2'])] for k, lst in d.items()}
输出:
{'Address_1': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 8,
'Check2': 1}],
'Address_2': [{'Name': 'name',
'Address_match': 'address_match_1',
'ID': 'id',
'Type': 'abc',
'Check1': 30,
'Check2': 1}]}