如何将数组字典的数组转换为数据帧?

2024-05-06 11:21:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个嵌套字典数组:

数据={“A”:“A”,“B”:“B”,“ID”:[{“ii”:“ABC”,“jj”:“BCD”},{“ii”:“AAC”,“jj”:“FFD”}],“Finish”:“yes”}

我曾经

res = pd.DataFrame.from_dict(data , orient='index')

但是ID仍然作为字典列表返回

A  B      ID                                              Finish
a  b  [{"ii":"ABC","jj":"BCD"},{"aa":"AAC","bb":"FFD"}]    yes

但是我想把所有的东西都转换成df。不知道怎么做。请帮忙

预期产出:

A  B  ID.ii  ID.jj   Finish
a  b   ABC    BCD      yes
a  b   AAC    FFD      yes

Tags: 数据iddataframe字典res数组yesii
1条回答
网友
1楼 · 发布于 2024-05-06 11:21:30

要在不使用json_normalize的情况下实现这一点,您可以像这样预处理输入-

data = {"A":"a","B":"b","ID":[{"ii":"ABC","jj":"BCD"},{"ii":"AAC","jj":"FFD"}],"Finish":"yes"}
op = {}

for i in data:
    if isinstance(data[i], list):
        for j in data[i]:
            for k in j:
                tmp = str(i)+"."+str(k)
                if tmp not in op:
                    op[tmp] = [j[k]]
                else:
                    op[tmp].append(j[k])
    else:
        op[i] = data[i]

        
>>> data
{'A': 'a', 'B': 'b', 'ID': [{'ii': 'ABC', 'jj': 'BCD'}, {'ii': 'AAC', 'jj': 'FFD'}], 'Finish': 'yes'}
>>> op
{'A': 'a', 'B': 'b', 'ID.ii': ['ABC', 'AAC'], 'ID.jj': ['BCD', 'FFD'], 'Finish': 'yes'}

之后你可以直接使用

>>> pd.DataFrame(op)

   A  B ID.ii ID.jj Finish
0  a  b   ABC   BCD    yes
1  a  b   AAC   FFD    yes
网友
2楼 · 发布于 2024-05-06 11:21:30

您可以使用pandasjson_normalize实现这一点

df = pd.json_normalize(data, meta=['A', 'B'], record_path=['ID'], record_prefix="ID.")

输出

  ID.ii ID.jj  A  B
0   ABC   BCD  a  b
1   AAC   FFD  a  b

记录路径-将用于展平特定键 记录前缀-作为列前缀添加 meta-是需要在不展平的情况下保留的列

有关示例,请参阅documentation

相关问题 更多 >