[英]Removing a nested key value pair from dictionary based on value in dataframe
問題一方面幫助一方面幫助好奇心,所以我有一個字典,一旦我的所有條件都被迭代,我就會將它附加到一個列表中:
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)
基本上,我正在向 dict l 添加多個鍵和值,我的主要問題是,提供'id' == 'None'
的值之一我不想將整個鍵值對添加到字典中。
所以最好的情況 output 看起來像:
final_l = {'external': {'om': {'id' : '123'},
'wd': {'id': '456'},
'wk': {'id': '789'}
}}
但是:根據相應的 dataframe 值提供其中一個值== 'None'
,我不想用 None 替換 'id',我根本不想在那里,所以理想情況下說'wk' == 'None'
那么 output 字典看起來像:
final_l = {'external': {'om': {'id' : '123'},
'wd': {'id': '456'}
}}
但我唯一能得到的是:
final_l = {'external': {'om': {'id' : '123'},
'wd': {'id': '456'},
'wk': {'id': 'None'}
}}
這對我的用例來說不是最佳的。 那么,如何根據對應的 dataframe 值從字典中刪除(甚至不添加)特定鍵值對? 此外,如果有更好的方法可以做到這一點,我非常願意接受,因為這“有效”,但上帝不優雅。
編輯樣本 Dataframe:
id_check om wd wk
0 Add all 123 None 789
1 Add all 472 628 None
2 Add None 528 874 629
我正在根據您嘗試更改字典而不是 dataframe 的回復來編輯我之前的答案,因為我之前的答案不正確。
我找不到一種方法來使用一種簡單的方法來完成您所要求的事情 - 例如列表理解,但能夠使用我創建的這個轉換器來做到這一點:
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', 'b', 'c']
>>> conv.rows
[(1, 'a', 'q'), (2, 'b', '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': ['a', 'b'], 'c': ['q', '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()
Output:
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'}}}
並忽略 value == None
的鍵:
{'external': {'om': {'id' : '123'},
'wd': {'id': '456'}}}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.