Я извлекаю данные из файла json, который очень сложный. После генерации фрейма данных из json один из столбцов снова содержит json данных. Чтобы извлечь данные из этого столбца и сохранить их в другой или той же таблице, я делаю следующие шаги:
Я также перешел по этой ссылке:
Python Pandas - Concat два фрейма данных с различным количеством строк и столбцов
Фрейм данных A
выглядит следующим образом (после извлечения из raw json) ID
является уникальным ключом здесь:
ID A B C
1 - - [{ a:{} },{}...]
2 - - - - - -
3 ......
Я хочу извлечь столбец C. Чтобы увидеть структуру ОДНОГО ВХОДА столбца C:
[ {
'X': 'abc', 'Y': 1, 'Z': 4174, 'S': 468,
'E': {'M': 'bm', 'T': 'sp', 'P': 0, 'Q': 'true', 'I': '1', 'T': 'ct', 'PV': 1, 'PG': 24, 'SD': '9',
'KL': 1, 'SI': 0,
'DR': 127, 'LT': 3, 'CC': 'K', 'MS': 'vl', 'DM': '240', 'ERS': 0, 'CUD': '1', 'CPR': -127, 'C':
'ijk', 'IST': 'f', 'DRI': 40,
'ATM': 'qwe', 'CSN': '116', 'MDF': '789', 'AAB': 'ol', 'CDG': '07', 'CPN': '89', 'CTY': 't',
'PCG': {'CUD': '1', 'BBC': '09', 'CPR': -127}, 'EVV': '10.7000', 'TRG': -127, 'CMIX': '25088',
'SNB': '1',
'IID': '1.3.0', 'BBC': '09', 'OI': 'pil', 'GSO': 'f', 'POL': 'ok', 'S00': 1},
'EYR': 'sp'
},
{'X': 'abc',
'Y': 1, 'Z': 4174, 'S': 469, 'E': {'M': 'bm', 'T': 'QWERT', 'Q': 'true',
'I': '1', 'T': 'm', 'PV': 1, 'P': 0, 'KL': 1, 'SI': 0,
'LT': 3, 'CC': 'K', 'DM': '240', 'CUD': '1', 'CPR': -127,
'IST': 'f', 'DRI': 0, 'ATM': 'qwe', 'CSN': '116', 'MDF': '789', 'AAB':
'ol', 'CDG': '25088240', 'CPN': '89', 'CTY': 't', 'TRG': 0, 'CMIX': '25088',
'DR': 0, 'IID': '1.3.0', 'POL': 'unknown', 'BBC': '09', 'GSO': 'f', 'SD':
'9'}, 'EYR': 'sp'},
{'X':
'abc', 'Y': 1, 'Z': 4174, 'S': 470, 'E':
{'M': 'bm', 'T': 'QWERT', 'P': 0, 'Q': 'true', 'I': '1', 'T':
'genuinepil', 'PV': 1, 'PG': 24, 'SD': '9', 'KL': 1, 'SI': 0,
'DR': 127, 'LT': 3, 'CC': 'K', 'MS': 'vl', 'DM': '240', 'ERS':
1900, 'CUD': '1', 'CPR': -127, 'C':
'ijk', 'IST': 'f', 'DRI': 127, 'ATM': 'qwe', 'CSN': '116', 'MDF': '789',
'AAB': 'ol', 'CDG': '07', 'CPN': '89', 'CTY': 't', 'PCG': {'CUD':
'1', 'BBC': '09', 'CPR': -127}, 'EVV': '10.7000', 'TRG': -127,
'CMIX': '25088', 'SNB': '1', 'IID': '1.3.0', 'BBC': '09', 'OI': 'pil', 'GSO': 'f',
'POL': 'ok', 'S00': 1}, 'EYR': 'sp'},
{'X': 'abc',
'Y': 1, 'Z': 4174, 'S': 471, 'E': {'M': 'bm', 'T': 'sp', 'P': 0,
'Q': 'true', 'I': '1', 'T': 'ct', 'PV': 1, 'PG': 24, 'SD':
'9', 'KL': 1, 'SI': 0, 'DR': 127, 'LT': 3, 'CC':
'K', 'MS': 'vl', 'DM': '240', 'ERS': 1900, 'CUD': '1',
'CPR': -127, 'C':
'ijk', 'IST': 'f', 'DRI': 127, 'ATM': 'qwe', 'CSN': '116', 'MDF': '789',
'AAB': 'ol', 'CDG': '07', 'CPN': '89', 'CTY': 't', 'PCG': {'CUD':
'1', 'BBC': '09', 'CPR': -127}, 'EVV': '10.7000', 'TRG': -127,
'CMIX': '25088', 'SNB': '1', 'IID': '1.3.0', 'BBC': '09', 'OI': 'pil', 'GSO': 'f',
'POL': 'ok', 'S00': 1}, 'EYR': 'sp'}
]
Выше приведено только одно значение столбца C. Сложность заключается в том, что значения в именах столбцов отличаются и иногда не имеют одинакового количества словаря.
Мой код:
df # dataframe `A`
C_data=pd.DataFrame()
for i, row1 in df.iterrows():
mul_eve=[]
col_len=[]
sub_df = pd.io.json.json_normalize(row1["C"])
sub_df.columns = sub_df.columns.map(lambda x: x.split(".")[-1])
# sub_df is a datframe made from one row entry of column C
sub_df["id"]=[row1["id"] for i in range(sub_df.shape[0])]
# Since `id` is the primary key from df `A` so appending same `id` to one value of column C in sub_df. As one entry of column C makes a dataframe of size 3 or 4 or 5.( Depending on Json)
if len(C_data)==0:
C_data=sub_df.copy()
else:
#frames = [C_data, sub_df]
C_data=C_data.merge(sub_df, how='outer', on='id')
Для создания фермы данных требуется много времени C_data
. Есть ли эффективный способ справиться с этим.