我有一个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
答案 0 :(得分:2)
使用pd.Series.str.len
生成适当的值以传递给np.repeat
。这又用于重复df.card_id.values
的值并创建新数据帧的第一列。
然后在pd.Series.sum
上使用df['labels']
将所有列表连接到一个列表中。这个新列表现在非常适合传递给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'}],
]
))
答案 1 :(得分: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']