2017-07-30 61 views
1

我有一个包含字典的列表(某些行)Python的数据帧新的数据框: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 

回答

2

使用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'}], 
    ] 
)) 
+0

工作就像一个魅力。谢谢! –

0

你可以做到这一点作为一个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'] 
相关问题