【问题标题】:Repeat DataFrame rows against the child DataFrame针对子 DataFrame 重复 DataFrame 行
【发布时间】:2020-09-10 03:38:36
【问题描述】:

源是带有嵌套字典的 JSON 文件。

我创建了一个顶级的 defaultdict(dict) 和一个 for 循环来获取第 1 到 7 行、列 State、Size、Pop 的数据框。

在上面的 for 循环中,我再次创建了另一个(子)defaultdict(dict) 和 for 循环来获取第 1 到 2 行、City、Size、Pop 列的数据框

我将孩子 defaultdict(dict) 附加到顶部 defaultdict(dict)

父数据框的行应针对子数据框重复

想要的输出

    State   Size    Pop   City      Size    Pop
1    MH     120     300    MU        100    150
2    MH     120     300    PU        80     110
3    MH     120     300    NG        75     120
4    MH     120     300    PC        85     110
5    GJ     110     250    SU        70     100
6    GJ     110     250    VA        75     80
7    GJ     110     250    AH        85     120

另一个输入 JSON 的例子

输入 JSON:

{
    "datatop": [
        {
            "datastate": {
                "attributes": {
                    "Name": "ABC",
                    "Place": "123"
                },
                "children": [
                    {
                        "datacity": {
                            "attributes": {
                                "CName": "EFG",
                                "CPlace": "12345"
                            }
                        }
                    },
                    {
                        "datacity": {
                            "attributes": {
                                "CNAME": "HIJ",
                                "CPlace": "6789"
                            }
                        }
                    }
                ]
            }
        },
        {
            "datastate": {
                "attributes": {
                    "Name": "XYZ",
                    "Place": "456"
                },
                "children": [
                    {
                        "datacity": {
                            "attributes": {
                                "CName": "LMN",
                                "CPlace": "1123"
                            }
                        }
                    },
                    {
                        "datacity": {
                            "attributes": {
                                "CName": "OPQ",
                                "CPlace": "22345"
                            }
                        }
                    }
                ]
            }
        }
    ],
    "totalCount": "2"
}

预期输出:

Name    Place   CName   CPlace
ABC     123     EFG     12345
ABC     123     HIJ     6798
XYZ     456     LMN     1123
XYZ     456     OPQ     22345

【问题讨论】:

  • 请包括示例输入

标签: python pandas dataframe


【解决方案1】:

通过改变我的方法,我能够实现预期的输出。

之前我试图重复父数据框中的行(我从父 for 循环获得的那些)与来自子 for 循环的数据框的行。

新方法: 在父 for 循环之前创建了一个空列表。 将键值对从父 for 循环装到子 for 循环,并创建了一个大字典,其中包含来自父级和子(嵌套)for 循环的键值对。为了制作唯一键,我使用了父子索引的字符串连接 for 循环。 一旦子 for 循环结束,在它之外(在父 for 循环的末尾),我将字典转换为数据框并将其附加到列表中。 一旦父 for 循环完成,列表就完成了数据帧。 最后,我对列表中的数据框进行了串联。

import json
import pandas as pd
from collections import defaultdict

with open("./input.json") as file:
    filedata = json.load(file)

data = filedata['datatop']

dflist = []

for i in range (len(data)):

    attribute = (data[i])['datastate']['attributes']
    child = (((data[i]['datastate'])['children']))

    def_dct_chd = defaultdict(dict)

    # For Loop to Iterate over all the subnets of the L3OUT EPG
    for j in range (len(child)):
        def_dct_chd[str(i)+str(j)]['Name'] = attribute['Name']
        def_dct_chd[str(i)+str(j)]['Place'] = attribute['Place']
        def_dct_chd[str(i)+str(j)]['CName'] = child[j]['datacity']['attributes']['CName']
        def_dct_chd[str(i)+str(j)]['CPlace'] = child[j]['datacity']['attributes']['CPlace']

    # Create the Data Frames out of the dictionary and append it to the list
    dflist.append(pd.DataFrame(def_dct_chd).T)

# concatenate all the dictionaries inside the list
finaldf = pd.concat(dflist)

finaldf = finaldf.reset_index(drop=True)
print(finaldf)

【讨论】:

    猜你喜欢
    • 2012-08-24
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2021-11-25
    • 2019-01-28
    • 2020-04-28
    • 2018-07-07
    相关资源
    最近更新 更多