【问题标题】:Python Dataframe contains a list of dictionaries, need to create new dataframe with dictionary itemsPython Dataframe 包含字典列表,需要使用字典项创建新的 dataframe
【发布时间】:2018-01-06 09:58:58
【问题描述】:

我有一个 Python 数据框,其中包含一个字典列表(对于某些行):

In[1]:
cards_df.head()

Out[1]:
    card_id   labels
0   'cid_1'   []
1   'cid_2'   []
3   'cid_3'   [{'id': 'lid_a', 'name': 'lname_a'}, {'id': 'lid_b', 'name': 'lname_b'}]
4   'cid_4'   [{'id': 'lid_c', 'name': 'lname_c'}]

我想创建一个新的数据框,将字典项目列表扩展为单独的行:

    card_id   label_id  label_name
0   cid_3     lid_a     lname_a
1   cid_3     lid_b     lname_b
2   cid_4     lid_c     lname_c

【问题讨论】:

    标签: python pandas dictionary dataframe


    【解决方案1】:

    使用pd.Series.str.len 生成适当的值以传递给np.repeat。这又用于重复 df.card_id.values 的值并制作我们新数据框的第一列。

    然后在df['labels'] 上使用pd.Series.sum 将所有列表连接成一个列表。这个新列表现在非常适合传递给pd.DataFrame 构造函数。剩下的就是在每个列名前面加上一个字符串,然后加入我们在上面创建的列。

    pd.DataFrame(dict(
        card_id=df.card_id.values.repeat(df['labels'].str.len()),
    )).join(pd.DataFrame(df['labels'].sum()).add_prefix('label_'))
    
      card_id label_id label_name
    0   cid_3    lid_a    lname_a
    1   cid_3    lid_b    lname_b
    2   cid_4    lid_c    lname_c
    

    设置

    df = pd.DataFrame(dict(
        card_id=['cid_1', 'cid_2', 'cid_3', 'cid_4'],
        labels=[
            [],
            [],
            [
                {'id': 'lid_a', 'name': 'lname_a'},
                {'id': 'lid_b', 'name': 'lname_b'}
            ],
            [{'id': 'lid_c', 'name': 'lname_c'}],
        ]
    ))
    

    【讨论】:

    • 工作就像一个魅力。谢谢!
    【解决方案2】:

    您可以通过 dict 理解数据框的行来执行此操作:

    pd.DataFrame({{i: {'card_id': row['card_id'], 
                       'label_id': label['label_id'], 
                       'label_name': label['name']}}
                   for i, row in df.iterrows()
                   for label in row['labels']
    

    【讨论】:

      猜你喜欢
      • 2021-03-17
      • 2018-08-23
      • 2020-09-22
      • 2022-10-13
      • 2020-08-31
      • 2021-08-30
      • 1970-01-01
      • 2018-12-13
      • 2021-10-04
      相关资源
      最近更新 更多