When I use .tolist(), it split only not null value. The index is the error by up. import pandas as pd from ast import literal_eval
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': 'Jame', 'Shop': 'Casio', 'Item': '[]',
'Card': '[]', 'Type': '{}', 'Price': 17000},
{'CusID': 4, 'Name': 'Bill', 'Shop': 'Nike', 'Item': '[{"Food":"004","Water":"Banana","Dessert":""}]',
'Card': '[{"Main":"Yes", "Second":""}]', 'Type': '{"VIP":"YES"}', 'Price': 900}]
df = pd.DataFrame(d)
Dataframe:
CusID Name Shop Item Card Type Price
1 Paul Pascal [{"Food":"001","Water":"Melon","Dessert":"Mang... [{"Main":"Yes", "Second":""}] {"VIP":"YES"} 24000
2 Mark Casio [{"Food":"001","Water":"Apple","Dessert":"Mang... [{"Main":"", "Second":"Yes"}] {"VIP":"YES"} 30800
3 Jame Casio [] [] {} 17000
4 Bill Nike [{"Food":"004","Water":"Banana","Dessert":""}] [{"Main":"Yes", "Second":""}] {"VIP":"YES"} 900
Then
def f(x):
try:
return literal_eval(str(x))
except Exception as e:
return []
df["Item"] = df["Item"].apply(lambda x: f(x))
df["Card"] = df["Card"].apply(lambda x: f(x))
df["Type"] = df["Type"].apply(lambda x: f(x))
a = pd.DataFrame(df.pop('Item').str[0].dropna().tolist()).add_prefix('Item_')
b = pd.DataFrame(df.pop('Card').str[0].dropna().tolist()).add_prefix('Card_')
c = pd.DataFrame(df.pop('Type').tolist())
out2 = df.join(i for i in [a,b,c]).fillna('')
out2
The result:
CusID Name Shop Price Item_Food Item_Water Item_Dessert Card_Main Card_Second VIP
1 Paul Pascal 24000 001 Melon Mango Yes YES
2 Mark Casio 30800 001 Apple Mango Yes YES
3 Jame Casio 17000 004 Banana Yes
4 Bill Nike 900 YES
I found it's wrong result. I want to get here:
CusID Name Shop Price Item_Food Item_Water Item_Dessert Card_Main Card_Second VIP
1 Paul Pascal 24000 001 Melon Mango Yes YES
2 Mark Casio 30800 001 Apple Mango Yes YES
3 Jame Casio 17000
4 Bill Nike 900 004 Banana Yes YES