Мне было очень трудно сформулировать вопрос, используя правильные слова .. Но я надеюсь, что я проделал хорошую работу ..
Вот пример, который я создал искусственно, чтобы вы могли воспроизвести его вваша консоль.
example = pd.DataFrame([['a', [{'a1': 1,
'a2': {'amount': 20, 'currency': 'USD'}, 'a3': 57},
{'a1': 4,
'a2': {'amount': 50, 'currency': 'USD'}},
{'a1': 7,
'a2': {'amount': 80, 'currency': 'USD'}}], 10, 11],
['b', [{'a1': 13,
'a2': {'amount': 140, 'currency': 'USD'}},
{'a1': 2,
'a2': {'amount': 50, 'currency': 'USD'}},
{'a1': 3,
'a2': {'amount': 90, 'currency': 'USD'}}], 16, 17],
['c', [{'a1': 8,
'a2': {'amount': 75, 'currency': 'USD'}},
{'a1': 9,
'a2': {'amount': 90, 'currency': 'USD'}, 'a3': 98},
{'a1': 6,
'a2': {'amount': 10, 'currency': 'USD'}}], 11, 12]])
example.columns = ['column1', 'column2', 'column3', 'column4']
print(example)
Второй столбец DataFrame example
представляет собой список словарных структур, подобных структуре.
print(example.loc[[0], ["column2"]].values.tolist())
[[[{'a1': 1, 'a2': {'amount': 20, 'currency': 'USD'}, 'a3': 57},
{'a1': 4, 'a2': {'amount': 50, 'currency': 'USD'}},
{'a1': 7, 'a2': {'amount': 80, 'currency': 'USD'}}]]]
Это строка 0
, столбец с именем column2
которые я напечатал, используя loc
.
Оператор print(exampleSolution)
должен дать вам Pandas DataFrame, который я хочу получить.
exampleSolution = pd.DataFrame([['a', 1, 20, 'USD', 57, 10, 11], ['a', 4, 50, 'USD', None, 10, 11],
['a', 7, 80, 'USD', None, 10, 11], ['b', 13, 140, 'USD', None, 16, 17],
['b', 2, 50, 'USD', None, 16, 17], ['b', 3, 90, 'USD', None, 16, 17],
['c', 8, 75, 'USD', None, 11, 12], ['c', 9, 90, 'USD', 98, 11, 12],
['c', 6, 10, 'USD', None, 11, 12]])
exampleSolution.columns = ['column1', 'a1', 'amount', 'currency', 'a3', 'column3', 'column4']
print(exampleSolution)
По сути, я хочу словарьвнутри column2
, который нужно распаковать для каждой строки, я хочу, чтобы ключ словаря был именем дополнительного столбца, а значение в строке было значением словаря, соответствующего этому ключу.В случае, если есть определенные ключи, пары значений для других строк (как в моем примере, мы видим первую строку 0
, которую я использовал loc
, чтобы распечатать, имея этот ключ a3
, тогда как эта же строка 0
делаетне иметь a3
во втором и третьем элементе своего вложенного словаря! И, аналогично, строка 2
также имеет ключ a3
во втором элементе своего вложенного словаря. Точно так же Я хочу, чтобы решениебыть устойчивым к случаям, когда во вложенном словаре может быть определенная пара ключ-значение, которая НИКОГДА не видна ни в одной другой строке! Может быть a4
во вложенном словаре column2
для конкретной строки,и a5
для другой строки, я хочу, чтобы эти дополнительные столбцы существовали в результирующем кадре данных независимо от None
или NaN
! Кроме того, второй столбец, как вы, возможно, уже видели, имеет ключ a2
, в которой есть вложенная пара (ключ, значение), которую я хочу использовать в качестве отдельных столбцов amount
, currency
ключ, пара значений.
column1 a1 amount currency a3 column3 column4
0 a 1 20 USD 57.0 10 11
1 a 4 50 USD NaN 10 11
2 a 7 80 USD NaN 10 11
3 b 13 140 USD NaN 16 17
4 b 2 50 USD NaN 16 17
5 b 3 90 USD NaN 16 17
6 c 8 75 USD NaN 11 12
7 c 9 90 USD 98.0 11 12
8 c 6 10 USD NaN 11 12
Что я уже сделал?
Мне стыдно сказать, что я не знаю, с чего начать ..
Приведенный выше пример - это МНОГО МЕНЬШЕ версия Pandas DataFrame, которую я получил из файла JSON (300 МБ).Сначала я излишне потратил МНОГО времени на создание вложенной структуры словаря, а затем разархивировал сложный вложенный словарь, только чтобы обнаружить, что команда для создания DataFrame из JSON была pd.read_json()
..