在Pandas中扩展嵌套的json

时间:2019-08-21 12:42:48

标签: python pandas

我正在尝试将嵌套的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

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

我需要将所有内容都放入一个Pandas表中,同时扩展了Properties和Services。

所以我试试这个:

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']}

如何在一个大的Pandas数据框中(每个列仅包含一种类型的信息)获得此信息?

此代码有效:

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])

但是,可能要花一周的时间。所以我希望有更好的方法?

0 个答案:

没有答案