我有多个字典,我正在尝试将它们附加到一个数据框中。
import pandas as pd
dict1 = {'A': '1', 'B': [{'att1': 'value1', 'att2': 'value2'}]}
dict2 = {'A': '2', 'B': [{'att1': 'value3', 'att2': 'value4'}]}
df = pd.DataFrame()
dict = [dict1, dict2]
df['A'] = []
for i in range(0, 2):
df = df.append(dict[i]['B'])
df['A'] = (dict[i]['A'])
这给出
A att1 att2
0 2 value1 value2
0 2 value3 value4
但是我想要
A att1 att2
0 1 value1 value2
0 2 value3 value4
有人可以帮忙吗?
答案 0 :(得分:2)
构建要添加的行:
for i in range(0, 2):
row = dict[i]['B']
row[0].update({'A': dict[i]['A']})
df = df.append(row)
print(df)
输出:
A att1 att2
0 1 value1 value2
A att1 att2
0 1 value1 value2
0 2 value3 value4
如果您研究如何从dict(或JSON对象)构建整个数据框架,这对您来说可能会更平滑。我只解决了眼前的问题。
答案 1 :(得分:1)
u可以使用json normalize:
from pandas import json_normalize
def normalize(mapping):
return json_normalize(mapping, 'B', 'A')
pd.concat((normalize(dict1),normalize(dict2)))
att1 att2 A
0 value1 value2 1
0 value3 value4 2
答案 2 :(得分:0)
您可以使用pd.concat
(
pd.concat([pd.DataFrame(dict1), pd.DataFrame(dict2)])
.pipe(lambda x: pd.concat([x,x.B.apply(pd.Series)],1))
.drop('B',1)
)
A att1 att2
0 1 value1 value2
0 2 value3 value4
答案 3 :(得分:0)
基于pd.json_normalize
的一种优雅的解决方案是可行的,但是一个
这样的障碍是,两个词典中的B
键都包含
一个带有单个元素的列表,而它们应该只包含
这个元素。
要克服此障碍,请执行列表理解,创建列表 字典,具有嵌套字典理解功能,可转换此类列表 变成基础元素:
dct = [ { k: v[0] if isinstance(v, list) else v for k, v in d.items()}
for d in [dict1, dict2]]
结果是:
[{'A': '1', 'B': {'att1': 'value1', 'att2': 'value2'}},
{'A': '2', 'B': {'att1': 'value3', 'att2': 'value4'}}]
然后您可以致电df = pd.json_normalize(dct)
,获得:
A B.att1 B.att2
0 1 value1 value2
1 2 value3 value4
剩下要做的就是重命名两个 B.…列:
df.rename(columns={'B.att1' : 'att1', 'B.att2' : 'att2'}, inplace=True)
现在您拥有了想要的东西,即:
A att1 att2
0 1 value1 value2
1 2 value3 value4
警告:pd.json_normalize
出现在 Pandas 版本 1.0 中。
先前,此方法“隐藏”在pandas.io.json
程序包中。
答案 4 :(得分:0)
从艾伦(Allen)搬家,我最终通过以下方式得到了我需要的东西:
dict1 = {'A': '1', 'B': [{'att1': 'value1', 'att2': 'value2'}]}
dict2 = {'A': '2', 'B': [{'att1': 'value3', 'att2': 'value4'}]}
dict = [dict1, dict2]
df = pd.DataFrame()
df['A'] = []
for i in range(0, 2):
df = df.append(pd.concat([pd.DataFrame(dict[i])]).pipe(lambda x: pd.concat([x, x.B.apply(pd.Series)], 1)).drop('B', 1))
print(df)
给予
A att1 att2
0 1 value1 value2
0 2 value3 value4