2017-07-30 25 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'] 
相關問題