【问题标题】:creating dataframe using list of dictionaries使用字典列表创建数据框
【发布时间】:2021-08-18 10:40:17
【问题描述】:

我有一个字典列表如下

test_lst = [{'col1': 'https://link1.com', 'col2':['data1', 'data2', 'data3']},
            {'col1': 'https://link2.com', 'col2':['data3', 'data4', 'data5']},
            {'col1': 'https://link3.com', 'col2':['data6', 'data7', 'data8']}]

我想使用这个列表创建一个数据框。数据框应如下所示

    col1                 col2
0   https://link1.com    data1
1   https://link1.com    data2
2   https://link1.com    data3
3   https://link2.com    data3
4   https://link2.com    data4
5   https://link2.com    data5
6   https://link3.com    data6
7   https://link3.com    data7
8   https://link3.com    data8

但将test_lst 直接传递给pd.DataFrame 似乎会按如下方式创建数据框

    col1                col2
0   https://link.com    [data1, data2, data3]
1   https://link.com    [data3, data4, data5]
2   https://link.com    [data6, data7, data8]

这是我的代码

test_lst = [{'col1': 'https://link1.com', 'col2':['data1', 'data2', 'data3']},
            {'col1': 'https://link2.com', 'col2':['data3', 'data4', 'data5']},
            {'col1': 'https://link3.com', 'col2':['data6', 'data7', 'data8']}]

df = pd.DataFrame(test_lst)

我做错了什么?

【问题讨论】:

    标签: python pandas list dataframe dictionary


    【解决方案1】:

    使用DataFrame.explode 是最简单的解决方案:

    df = pd.DataFrame(test_lst).explode('col2')
    print (df)
        
                    col1   col2
    0  https://link1.com  data1
    0  https://link1.com  data2
    0  https://link1.com  data3
    1  https://link2.com  data3
    1  https://link2.com  data4
    1  https://link2.com  data5
    2  https://link3.com  data6
    2  https://link3.com  data7
    2  https://link3.com  data8
    

    或者用col1 之类的标量创建一个元素列表,然后用zip_longest 展平,最后向前填充缺失值:

    from  itertools import zip_longest
    
    test_lst = [{k: v if isinstance(v, list) else [v] for k, v in x.items()} for x in test_lst]
       
    L = [y for x in test_lst for y in zip_longest(*x.values())]
    
    df = pd.DataFrame(L, columns=test_lst[0].keys()).ffill()
    print (df)
                    col1   col2
    0  https://link1.com  data1
    1  https://link1.com  data2
    2  https://link1.com  data3
    3  https://link2.com  data3
    4  https://link2.com  data4
    5  https://link2.com  data5
    6  https://link3.com  data6
    7  https://link3.com  data7
    8  https://link3.com  data8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-26
      • 2017-08-23
      相关资源
      最近更新 更多