Разверните столбец, содержащий пары ключ-значение, в свои собственные столбцы - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть pandas dataframe, который выглядит следующим образом:

df = pd.DataFrame({'x':['''[{"key":"Gender","value":["Men"]},
  {"key":"Shoe Size","value":["M"]},
  {"key":"Shoe Category","value":["Men's Shoes"]},
  {"key":"Color","value":["Multicolor"]},
  {"key":"Manufacturer Part Number","value":["8190-W-NAVY-7.5"]},
  {"key":"Brand","value":["Josmo"]}]''',

  '''[{"key":"Gender","value":["Women"]},
  {"key":"Size","value":["XL"]},
 {"key":"Heel Height","value":["1 Inches"]}]'''], 

  'y':['A','B']})

В основном это список пар ключ-значение, которые я хочу извлечь в свои собственные столбцы, а ключи не согласованы между строками.

Есть идеи, как это сделать?

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Вот возможное решение.Тем не менее, вы должны выяснить все возможные значения ключа заранее.Я думаю, это можно сделать программно, но я здесь их жестко закодировал.Кроме того, если в стоимости есть несколько элементов, он займет первое.

import pandas as pd
import json

# original dataframe
df = pd.DataFrame({'x':['''[{"key":"Gender","value":["Men"]},
  {"key":"Shoe Size","value":["M"]},
  {"key":"Shoe Category","value":["Men's Shoes"]},
  {"key":"Color","value":["Multicolor"]},
  {"key":"Manufacturer Part Number","value":["8190-W-NAVY-7.5"]},
  {"key":"Brand","value":["Josmo"]}]''',

  '''[{"key":"Gender","value":["Women"]},
  {"key":"Shoe Size","value":["M"]},
  {"key":"Shoe Category","value":["Women's Shoes"]},
  {"key":"Color","value":["Multicolor"]},
  {"key":"Manufacturer Part Number","value":["8190-W-NAVY-7.5"]}]'''], 

  'y':['A','B']})

expanded_columns = ['Gender', 'Shoe Size', 'Shoe Category', 'Color',
                    'Manufacturer Part Number', 'Brand']

# function to create list of values from json text
def json_to_cols(s):
  l = json.loads(s)
  d = {i:None for i in expanded_columns}

  for row in l:
    d[row['key']] = row['value'][0]

  return list(d.values())

# Create new dataframe with expanded columns
df1 = df.apply(lambda row: pd.Series(json_to_cols(row['x']), index=expanded_columns),
            axis=1)    
new_df = df.join(df1)
print(new_df)
0 голосов
/ 23 сентября 2019

Не совсем понятно, что вы хотите, но следующий код сгенерирует фрейм данных, в котором имена столбцов взяты из y, индекс взят из ключей из x, а значения для каждого столбца:берется из значений в x, с NaN для любой не появившейся клавиши.

output_df = pd.DataFrame(
            {input_row[1]['y']:
                {
                        pair['key']: pair['value'][0] 
                        for pair in ast.literal_eval(input_row[1]['x'])
                }
                for input_row in df.iterrows()
            }      
        )

вывод:

                                   A         B
Brand                               Josmo       NaN
Color                          Multicolor       NaN
Gender                                Men     Women
Heel Height                           NaN  1 Inches
Manufacturer Part Number  8190-W-NAVY-7.5       NaN
Shoe Category                 Men's Shoes       NaN
Shoe Size                               M       NaN
Size                                  NaN        XL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...