Как преобразовать несколько столбцов списка словаря, набора, кортежа в столбцы - PullRequest
0 голосов
/ 16 июня 2020

У меня есть некоторая структура и данные

CusID   Name    Shop    Item                                                Card                          Type               Price
1       Paul    Pascal  [{"Food":"001","Water":"Melon","Dessert":"Mango"}]  [{"Main":"Yes", "Second":""}]   {"VIP":"YES"}   24000
2       Mark    Casio   [{"Food":"001","Water":"Apple","Dessert":"Mango"}]  [{"Main":"", "Second":"Yes"}]   {"VIP":"YES"}   30800
3       Bill    Nike    [{"Food":"004","Water":"","Dessert":""}]            []                              {}               900

Я хочу разделить столбцы Item, Card и Type. Это ожидаемый результат

Name    Shop    Food    Water   Dessert Card_Main   Card_Second VIP Price
Paul    Pascal  1       Melon   Mango   Yes                     YES 24000
Mark    Casio   1       Apple   Mango               Yes         YES 30800
Bill    Nike    4                                                   900

Код для фрейма данных:

d = [{'CusID': 1, 'Name': 'Paul', 'Shop': 'Pascal', 
  'Item': [{"Food":"001","Water":"Melon","Dessert":"Mango"}],
  'Card': [{"Main":"Yes", "Second":""}], 'Type': {"VIP":"YES"}, 'Price': 24000}, 
  {'CusID': 2, 'Name': 'Mark', 'Shop': 'Casio', 'Item': [{"Food":"001","Water":"Apple","Dessert":"Mango"}], 
   'Card': [{"Main":"", "Second":"Yes"}], 'Type': {"VIP":"YES"}, 'Price': 30800}, 
 {'CusID': 3, 'Name': 'Bill', 'Shop': 'Nike', 'Item': [{"Food":"004","Water":"","Dessert":""}],
  'Card': [], 'Type': {}, 'Price': 900}]
df = pd.DataFrame(d)

Вот мой код для фрейма данных. В словаре списка есть '', но фрейм данных выглядит без разницы!

d = [{'CusID': 1, 'Name': 'Paul', 'Shop': 'Pascal', 
  'Item': '[{"Food":"001","Water":"Melon","Dessert":"Mango"}]',
  'Card': '[{"Main":"Yes", "Second":""}]', 'Type': '{"VIP":"YES"}', 'Price': 24000}, 
  {'CusID': 2, 'Name': 'Mark', 'Shop': 'Casio', 'Item': '[{"Food":"001","Water":"Apple","Dessert":"Mango"}]', 
   'Card': '[{"Main":"", "Second":"Yes"}]', 'Type': '{"VIP":"YES"}', 'Price': 30800}, 
 {'CusID': 3, 'Name': 'Bill', 'Shop': 'Nike', 'Item': '[{"Food":"004","Water":"","Dessert":""}]',
  'Card': [], 'Type': {}, 'Price': 900}]
df = pd.DataFrame(d)

1 Ответ

2 голосов
/ 16 июня 2020

Не то, что динамика c, но это можно решить с помощью:

a = pd.DataFrame(df.pop('Item').str[0].dropna().tolist())
b = pd.DataFrame(df.pop('Card').str[0].dropna().tolist()).add_prefix('Card_')
c = pd.DataFrame(df.pop('Type').tolist())
out = df.join(i for i in [a,b,c]).fillna('')
print(out)

   CusID  Name    Shop  Price Food  Water Dessert Card_Main Card_Second  VIP
0      1  Paul  Pascal  24000  001  Melon   Mango       Yes              YES
1      2  Mark   Casio  30800  001  Apple   Mango                   Yes  YES
2      3  Bill    Nike    900  004                                          
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...