展开Pandas中的嵌套json

2024-04-25 22:37:33 发布

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

我正在尝试将一个嵌套的json文件读入Pandas。文件可以在这里找到:European Bank Authorities

我解压文件,然后读取文件。第一行是这样的:

CA_OwnerID  EntityCode  EntityType  Properties  Services    __EBA_EntityVersion
0   GB_FCA  PSD_EMI!GB_FCA!900924   PSD_EMI [{'ENT_NAT_REF_COD': '900924'}, {'ENT_NAM': 'N...   [{'GB': ['ES_010', 'PS_010', 'PS_020', 'PS_03A...   20190820191050544

“属性”和“服务”列是问题所在。你知道吗

第一行的属性如下所示:

[{'ENT_NAT_REF_COD': 'C185005'},
 {'ENT_NAM': 'Paysafe Prepaid Services Limited'},
 {'ENT_ADD': 'Grand Canal House, Upper Grand Canal Street'},
 {'ENT_TOW_CIT_RES': 'Dublin 4'},
 {'ENT_POS_COD': 'DO4 Y7R5'},
 {'ENT_COU_RES': 'IE'},
 {'ENT_AUT': ['2019-03-04']}]

第一行的服务如下所示:

[{'IE': ['ES_010', 'PS_010', 'PS_020', 'PS_03B', 'PS_05A', 'PS_05B']},
 {'AT': ['ES_010', 'PS_010', 'PS_020', 'PS_03B', 'PS_05A', 'PS_05B']},
 {'BE': ['ES_010', 'PS_010', 'PS_020', 'PS_03B', 'PS_05A', 'PS_05B']},
 and it keeps on like this

对于数据中的所有行,属性和服务都包含不同数量的字段。你知道吗

我需要把所有的东西都放在一张桌子上,同时扩展属性和服务。你知道吗

所以我试试这个:

prop = json_normalize(data=data[1], record_path='Properties', 
                            meta=['ENT_NAT_REF_COD', 'ENT_NAM','ENT_ADD','ENT_TOW_CIT_RES', 'ENT_POS_COD', 'ENT_COU_RES',  'ENT_AUT', 'ENT_NAM_COM', 'ENT_EXC', 'ENT_DES_ACT_EXC_SCP', 'ENT_TYP_PAR_ENT','ENT_COD_PAR_ENT','DER_CHI_ENT_AUT'],  record_prefix='_', errors='ignore')

它扩展了行数,因为除了每行一个列之外,它在所有列中都给出了nan。因此,无法将其连接回主表。因此,行数从原始数据集中的189981行扩展到1701771行。你知道吗

所以我试了这个:

    Properties = df['Properties'].apply(pd.Series)
    Services = df['Services'].apply(pd.Series)

合并时:

result = pd.concat([df, Properties, Services], axis=1, sort=False)

列包含不同的数据。一列可能在一行中包含:{'ENT_TOW_CIT_RES': 'London'}和应该在下一行的另一列中包含的内容:{'ENT_ADD': ['207 Regent Street', '3rd Floor']}

在每个列只包含一种类型的信息的大熊猫数据帧中,怎么可能得到这样的结果?你知道吗

此代码适用于:

for i in range(0,len(df_head)):
print(i)
for y in df_head['Properties'][i]:
    print(list(y.keys())[0])
    print(list(y.values())[0])
    df_head.at[i, list(y.keys())[0]] = str(list(y.values())[0])
for y in df_head['Services'][i]:
    print(list(y.keys())[0])
    print(list(y.values())[0])
    df_head.at[i, list(y.keys())[0]] = str(list(y.values())[0])

不过,这可能需要一个星期。所以我希望有更好的方法?你知道吗


Tags: 文件df属性esrespropertieskeyshead