来自字典的Pandas DataFrame,带有嵌套的字典列表

时间:2016-04-07 21:54:53

标签: python dictionary pandas dataframe

my_dict = { 'company_a': [],
            'company_b': [ {'gender': 'Male',
                            'investor': True,
                            'name': 'xyz',
                            'title': 'Board Member'} ],
            'company_c': [],
            'company_m': [ {'gender': 'Male',
                            'investor': None,
                            'name': 'abc',
                            'title': 'Advisor'}, 
                            {'gender': 'Male',
                            'investor': None,
                            'name': 'opq',
                            'title': 'Advisor'} ],
            'company_x': [],
            'company_y': [] }

如何将上述Python字典转换为包含以下列的Pandas数据帧:company, gender, investor, name, title

company将由my_dict的顶级键填充。其他列将填充数组中字典中的值。

我已经尝试了pd.DataFrame.from_dict(my_dict, orient='index'),但它没有给我我想要的东西。

2 个答案:

答案 0 :(得分:3)

此版本使用None填充所有缺失值:

data = {'company': [], 'gender': [], 'investor': [], 'name': [], 'title': []}
for k, v in my_dict.items():
    for entry in v:
        data['company'].append(k)
    if not v:
        data['company'].append(k)
    for name in ['gender', 'investor', 'name', 'title']:
        has_entry = False
        for entry in v:
            has_entry = True
            data[name].append(entry.get(name))
        if not has_entry:
            data[name].append(None)
df = pd.DataFrame(data)
print(df)

输出:

     company gender investor  name         title
0  company_a   None     None  None          None
1  company_y   None     None  None          None
2  company_b   Male     True   xyz  Board Member
3  company_c   None     None  None          None
4  company_x   None     None  None          None
5  company_m   Male     None   abc       Advisor
6  company_m   Male     None   opq       Advisor

您还可以将所有None替换为NaN

print(df.fillna(np.nan))

输出:

     company gender investor name         title
0  company_a    NaN      NaN  NaN           NaN
1  company_y    NaN      NaN  NaN           NaN
2  company_b   Male     True  xyz  Board Member
3  company_c    NaN      NaN  NaN           NaN
4  company_x    NaN      NaN  NaN           NaN
5  company_m   Male      NaN  abc       Advisor
6  company_m   Male      NaN  opq       Advisor

答案 1 :(得分:0)

有点混乱,但这很灵活,具体取决于嵌套词典中的属性,并将公司放在他们自己的专栏中。

df = pd.DataFrame(columns = ['company'])
i = 0

for company in my_dict:
    for nested_dict in my_dict[company]:
        df.loc[i,'company'] = company
        for attribute in nested_dict.keys():
            df.loc[i, attribute] = nested_dict[attribute]
        i += 1

输出:

Out[46]:
    company     name  gender  title         investor
0   company_m   abc   Male    Advisor       NaN
1   company_m   opq   Male    Advisor       NaN
2   company_b   xyz   Male    Board Member  True
相关问题