#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)
желаемое состояние фрейма данных:
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
Что я сделал, так это перенес ключ словаря в отдельный столбец «Дата» и сохранил значения столбцов как есть. Где бы оно ни было нулевым, оно останется таким, какое оно есть.
Все столбцы будут иметь одинаковый словарь. т.е. Одинаковые диапазоны дат.
Я получаю исходный ответ в формате 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