根据其他键值对填写空白字典值

时间:2018-08-09 16:34:53

标签: python pandas dictionary missing-data

我有一个df,其中包含一列['mjtheme_namecode'],该列以字典的形式包含代码和名称。编码都带有数字,但是缺少一些名称。我想基于其他对使用相同的代码来填写缺少的名称值。这是有问题的df列:

import pandas as pd
import json
import numpy as np
from pandas.io.json import json_normalize
df = pd.read_json('data/world_bank_projects.json')
print(df['mjtheme_namecode'].head(15))

0     [{'code': '8', 'name': 'Human development'}, {...
1     [{'code': '1', 'name': 'Economic management'},...
2     [{'code': '5', 'name': 'Trade and integration'...
3     [{'code': '7', 'name': 'Social dev/gender/incl...
4     [{'code': '5', 'name': 'Trade and integration'...
5     [{'code': '6', 'name': 'Social protection and ...
6     [{'code': '2', 'name': 'Public sector governan...
7     [{'code': '11', 'name': 'Environment and natur...
8     [{'code': '10', 'name': 'Rural development'}, ...
9     [{'code': '2', 'name': 'Public sector governan...
10    [{'code': '10', 'name': 'Rural development'}, ...
11    [{'code': '10', 'name': 'Rural development'}, ...
12                          [{'code': '4', 'name': ''}]
13    [{'code': '5', 'name': 'Trade and integration'...
14    [{'code': '6', 'name': 'Social protection and ...
Name: mjtheme_namecode, dtype: object

我知道我可以将列设置为单独的df,然后填充,但是我认为我必须重新编制索引,因此我认为在那之后我不能将其放回原处。我在想,理想情况下,我将列出仅包含代码和名称的字典项的列表(无重复项),然后使用该列表在for循环中遍历字典,其中名称变为非重复列表中的匹配值我创建。这有意义吗?不知道如何去做。

1 个答案:

答案 0 :(得分:1)

您可以采用类似的方法来创建新的DataFrame,然后过渡回去:

theme= pd.DataFrame([val for pair in df['mjtheme_namecode'].values for val in pair])
mapper = theme.drop_duplicates().replace(r'', np.nan).dropna().set_index('code').name.to_dict()

使用列表理解功能将其组合在一起:

s = pd.Series(
    [[{'code': i['code'], 'name': mapper[i['code']]}
        for i in t] for t in df.mjtheme_namecode]
)

s.head(13)

0     [{'code': '8', 'name': 'Human development'}, {...
1     [{'code': '1', 'name': 'Economic management'},...
2     [{'code': '5', 'name': 'Trade and integration'...
3     [{'code': '7', 'name': 'Social dev/gender/incl...
4     [{'code': '5', 'name': 'Trade and integration'...
5     [{'code': '6', 'name': 'Social protection and ...
6     [{'code': '2', 'name': 'Public sector governan...
7     [{'code': '11', 'name': 'Environment and natur...
8     [{'code': '10', 'name': 'Rural development'}, ...
9     [{'code': '2', 'name': 'Public sector governan...
10    [{'code': '10', 'name': 'Rural development'}, ...
11    [{'code': '10', 'name': 'Rural development'}, ...
12    [{'code': '4', 'name': 'Financial and private ...
dtype: object

如您所见,最后一行(第12行)已正确填充,其他行也已正确填充,您可以将其重新分配给原始DataFrame。