【问题标题】:Pandas DataFrame from dictionary with nested lists of dictionaries带有嵌套字典列表的字典中的 Pandas DataFrame
【发布时间】:2023-04-02 16:43:01
【问题描述】:
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'),但它并没有给我想要的。

【问题讨论】:

    标签: python dictionary pandas dataframe


    【解决方案1】:

    此版本用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
    

    【讨论】:

    • 不错的解决方案,不如我删了。
    【解决方案2】:

    有点乱,但根据嵌套字典中的属性,这很灵活,并且会将公司放在自己的列中。

    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
    

    【讨论】:

      猜你喜欢
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 2017-12-26
      • 2018-05-30
      • 2019-06-27
      • 1970-01-01
      相关资源
      最近更新 更多