有这个:
items, name
0 { [{'a': 2, 'b': 1}, {'a': 4, 'b': 3}], this }
1 { [{'a': 2, 'b': 1}, {'a': 4, 'b': 3}], that }
但是希望将字典对象列表分解成(展平?)到这样的实际行中:
a, b, name
0 { 2, 1, this}
1 { 4, 3, this}
0 { 2, 1, that}
1 { 4, 3, that}
尝试使用melt
但没有运气,有什么想法吗?建议?
答案 0 :(得分:2)
pd.concat([pd.DataFrame(df1.iloc[0]) for x,df1 in df.groupby('name').group],keys=df.name)\
.reset_index().drop('level_1',1)
Out[63]:
name a b
0 this 2 1
1 this 4 3
2 that 2 1
3 that 4 3
数据输入
df = pd.DataFrame({ "group":[[{'a': 2, 'b': 1}, {'a': 4, 'b': 3}],[{'a': 2, 'b': 1}, {'a': 4, 'b': 3}]],
"name": ['this', 'that']})
答案 1 :(得分:2)
使用concat
的另一种方式可能更干净:
In [11]: pd.concat(df.group.apply(pd.DataFrame).tolist(), keys=df["name"])
Out[11]:
a b
name
this 0 2 1
1 4 3
that 0 2 1
1 4 3
In [12]: pd.concat(df.group.apply(pd.DataFrame).tolist(),
keys=df["name"]).reset_index(level="name")
Out[12]:
name a b
0 this 2 1
1 this 4 3
0 that 2 1
1 that 4 3
答案 2 :(得分:1)
ab = pd.DataFrame.from_dict(np.concatenate(df['items']).tolist())
lens = df['items'].str.len()
rest = df.drop('items', 1).iloc[df.index.repeat(lens)].reset_index(drop=True)
ab.join(rest)
a b name
0 2 1 this
1 4 3 this
2 2 1 that
3 4 3 that
答案 3 :(得分:0)
tmp_list = list()
for index, row in a.iterrows():
for list_item in row['items']:
tmp_list.append(dict(list_item.items()+[('name', row['name'])]))
pd.DataFrame(tmp_list)
a b name
0 2 1 this
1 4 3 this
2 2 1 that
3 4 3 that