Pandas: разбить список словаря определенной строки на несколько строк

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Как следует из названия, я застрял в ситуации, когда мне нужно разбить одну строку фрейма данных на несколько строк.

Текущее состояние фрейма данных:

 import pandas as pd
op_d = {'A': [['NULL', 'NULL','NULL','NULL','NULL']],
        'V':[[{'2016': '488.386000'},{'2017': '469.508000'},
              {'2018': '445.510000'},{'2019': '579.299000'},
              {'2020': '493.786000'}]],
        'Q':[[{'2016': '488.386000'},{'2017': '469.508000'},
              {'2018': '445.510000'},{'2019': '579.299000'},
               {'2020': '493.786000'}]],
         'Z': [['NULL', 'NULL','NULL','NULL','NULL']]}
df = pd.DataFrame(op_d)
  

df

желаемое состояние фрейма данных:

 op_d2 = {'Date':[2016,2017,2018,2019,2020],'A': ['NULL', 'NULL','NULL','NULL','NULL'],
        'V':[488.386000,469.508000,445.510000,579.299000,493.786000],
        'Q':[488.386000,469.508000,445.510000,579.299000,493.786000],
        'Z': ['NULL', 'NULL','NULL','NULL','NULL']}
result_df = pd.DataFrame(op_d2)
result_df
  

result_df

Что я сделал, так это перенес ключ словаря в отдельный столбец «Дата» и сохранил значения столбцов как есть. Где бы оно ни было нулевым, оно останется таким, какое оно есть.

Все столбцы будут иметь одинаковый словарь. т.е. Одинаковые диапазоны дат.

Я получаю исходный ответ в формате json, преобразуя его в dataframe для выполнения некоторых вычислений. Я был бы признателен за любую помощь.

Оригинальный ответ json:

   { 'Prop1': '',
   'Prop2': ['Somedata', 'SomeData2'],
   'Prop3': 5,
   'Prop4': '',
   'StartDate': '',
   'Function': 'ABC',
   'Identifier': 'ID001',
   'Col2': 2,
   'Prop5': 'XYZ',
   'Frequency': '',
   'Limit': '',
   'Rows': [{'Row': ['136.731000', '2016']},
            {'Row': ['135.331000', '2017']},
            {'Row': ['163.965000', '2018']},
            {'Row': ['153.371000', '2019']},
            {'Row': ['161.864000', '2020']}]},

}
  

Комментарии:

1. Я думаю, что pandas позволяет вам читать прямо из форматов JSON. Почему бы и нет df = pd.read_json(file_name, orient='columns') ? Смотрите Документы .

2. Я уже это сделал. затем очистил данные, произвел некоторое преобразование и достиг «текущего состояния».

3. Если вы уже загрузили json, можете ли вы уточнить, с какой проблемой вы столкнулись? Вы загрузили json, а затем преобразовали его в словарь, а затем хотите знать, как преобразовать этот словарь в другой фрейм данных? Как выглядит исходный json? Я предполагаю, что pandas не загружает это должным образом?

4. Я добавил оригинальный ответ json. однако здесь это не имеет значения. У меня есть сотни идентификаторов. некоторые из них мне просто нужно передать как есть, и это нормально. Проблема в том, что мне нужно выполнить вычисление между идентификаторами по годам («Строка»). т.е. ID003 ID005 для каждого из 2016,2017,2018,2019 и 2020. вот где я застрял.

5. в моем примере A, V, Q и Z являются просто другими идентификаторами, а «Текущее состояние фрейма данных» генерируется с использованием идентификаторов и строк.

Ответ №1:

Хотя я не могу делать никаких заявлений об эффективности, возможно, это то, что вам нужно.

 op_d_new = {k:(v[0] if v[0][0]=='NULL' else 
               [list(j.values())[0] for j in v[0]]) for k,v in op_d.items()}
for v in op_d.values():
    if v[0][0] == 'NULL':
        continue
    dates = [list(j.keys())[0] for j in v[0]]
    break
op_d_new.update({'Dates':dates})

df = pd.DataFrame(op_d_new)
df
  
       A           V           Q     Z Dates
0  NULL  488.386000  488.386000  NULL  2016
1  NULL  469.508000  469.508000  NULL  2017
2  NULL  445.510000  445.510000  NULL  2018
3  NULL  579.299000  579.299000  NULL  2019
4  NULL  493.786000  493.786000  NULL  2020