如何解决根据数据框中的值从字典中删除嵌套键值对
问题是一方面有助于好奇,另一方面我希望所有条件都经过迭代后,我便追加到列表中:
for col,row in df.iterrows():
up_list = []
if row['id_check'] == 'Add all':
l = {'external': {'om': {'id' : row['posm']},'wd': {'id': row['wdp']},'wk': {'id': row['tw'].replace('ru: ','')}
}
}
up_list.append(l)
基本上,我要向字典l添加多个键和值,而我的主要问题是,为'id' == 'None'
提供一个值,我不想将整个键值对添加到字典中。
因此最佳情况输出如下:
final_l = {'external': {'om': {'id' : '123'},'wd': {'id': '456'},'wk': {'id': '789'}
}}
但是:根据其相应的数据帧值提供了其中一个值== 'None'
,我不想将'id'替换为None,我根本就不想在那儿拥有它,因此理想情况下说'wk' == 'None'
,那么输出字典将类似于:
final_l = {'external': {'om': {'id' : '123'},'wd': {'id': '456'}
}}
但是我唯一能得到的是:
final_l = {'external': {'om': {'id' : '123'},'wk': {'id': 'None'}
}}
这不是我的用例的最佳选择。因此,如何根据字典的对应数据帧值从字典中删除(甚至不添加)特定的键值对?另外,如果有更好的方法可以做到这一点,那么我很乐意这样做,因为这种“可行”的方法,但天哪,这并不优雅。
编辑示例数据框:
id_check om wd wk
0 Add all 123 None 789
1 Add all 472 628 None
2 Add None 528 874 629
解决方法
我正在编辑上一个答案,这都是基于您的答复,即您试图更改字典而不是修改数据框,并且因为我的上一个答案不正确。
我找不到一种使用简单的好方法来完成您要问的方法的方法-例如列表理解,但能够使用我创建的此转换器来做到这一点:
class Converter:
def __init__(self):
self.rows = []
self.cols = []
@classmethod
def from_dict(cls,d):
conv_df = cls()
conv_df.cols = list(d.keys())
conv_df.rows = list(zip(*d.values()))
return conv_df
def as_dict(self):
vals = []
for idx,_ in enumerate(self.cols):
vals.append([j[idx] for j in self.rows if None not in j])
return {k: v for k,v in zip(self.cols,vals)
用法示例:
>>> z = {'a': [1,2,3],'b': ['a','b','c'],'c': ['q','r',None]}
>>> conv = Converter.from_dict(z)
>>> conv.cols
['a','c']
>>> conv.rows
[(1,'a','q'),(2,'r'),(3,'c',None)]
>>> "Get as dict and we expect last row not to appear in it:"
'Get as dict and we expect last row not to appear in it:'
>>> conv.as_dict()
{'a': [1,2],'b'],'r']}
,
IIUC,您可以尝试使用to_dict
,dropna
,eq
和to_list
:
final_l=df[df['id_check'].eq('Add all')].drop('id_check',1)
.apply(lambda x : {'external':x.dropna().to_dict()},axis=1)
.to_list()
输出:
final_l
[{'external': {'om': 123.0,'wk': '789'}},{'external': {'om': 472.0,'wd': '628'}}]
,
因此,我尝试了提供的答案,而遇到的最大问题是真相评估和速度。我将此代码编码为“有效”的代码,但从效率的角度来看,我对此不太满意:
if row['id_check'] == 'Add all IDs':
link_d,ex_link = {},{}
if row['posm'] != 'None':
link_d['om'] = {'id': row['posm']}
if row['pd'] != 'None':
link_d['wd'] = {'id': row['pd']}
if row['tw'] != 'None':
link_d['wk'] = {'id': row['tw']}
ex_link['external'] = link_d
up_list.append(ex_link)
up_d[row['id']] = up_list
all_list.append(up_d)
哪个输出:
{'external': {'om': {'id' : '123'},'wd': {'id': '456'},'wk': {'id': '789'}}}
并忽略值== {None
的键:
{'external': {'om': {'id' : '123'},'wd': {'id': '456'}}}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。