Ключ словаря, пары значений от ячейки до столбцов, имя которых является ключом, а строка является значением в Pandas - PullRequest
0 голосов
/ 31 мая 2018

Мне было очень трудно сформулировать вопрос, используя правильные слова .. Но я надеюсь, что я проделал хорошую работу ..

Вот пример, который я создал искусственно, чтобы вы могли воспроизвести его вваша консоль.

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() ..

1 Ответ

0 голосов
/ 02 июня 2018
from pandas.io.json import json_normalize    

rows = list(example.index)    

mainDf = pd.DataFrame()
for index in rows:
    listing = example.at[index, "column2"]

    df = pd.DataFrame()    


    for i in listing:


        l = (json_normalize(i))

        df = df.append(l)

    otherCols = list(example.columns)
    otherCols.remove('column2')

    for col in otherCols:
        #print(example.loc[[index], [col]])

        df[col] = example.at[index, col]

    mainDf = mainDf.append(df)


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