使用来自多个字典的for循环填充列

时间:2020-05-13 04:48:35

标签: python pandas dictionary for-loop append

我有多个字典,我正在尝试将它们附加到一个数据框中。

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

有人可以帮忙吗?

5 个答案:

答案 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