Pandas - Concat 2 кадра данных с различным количеством строк и столбцов, извлеченных из файла json в цикле - PullRequest
0 голосов
/ 17 февраля 2020

Я извлекаю данные из файла 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. Есть ли эффективный способ справиться с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...