I asked access to your file, but in the mean time let's use this example
import pandas as pd
df = pd.DataFrame({"A": [{"B":True, "C":'something'}, {"B": False, "C": "another"}]})
That generate this table:
| A |
| {"B":True, "C":'something'} |
| {"B": False, "C": "another"} |
To convert each key of the dictionaries to a newer column and have that with the original DataFrame you can do:
temp = pd.DataFrame([*df['A']], df.index)
df.join(temp)
With output as
| A |
B |
C |
| {"B":True, "C":'something'} |
True |
something |
| {"B": False, "C": "another"} |
False |
another |
EDIT
Okay now that I have your data I see where's the problem. The same thing I did on the example is valid for you, but in your case when we load the csv the Ambience column comes as string:
import pandas as pd
df = pd.read_csv('...')
df["Ambience"].values[0]
>>> "{'touristy': False, 'hipster': True, 'romantic': False, 'divey': False, 'intimate': False, 'trendy': True, 'upscale': False, 'classy': False, 'casual': True}"
To use the same approach in the first example we have to transform the string representation of the dictionary to an actual dictionary, to do that we can do:
import ast
df["Ambience"] = df["Ambience"].fillna("{}") # Filling NaN with an empty dict representation
amb = df["Ambience"].apply(lambda x: ast.literal_eval(x)).copy() # Using ast literal_eval to convert string representation to actual dict
amb = amb.apply(lambda x: x if x else None) # Making empty dicts as None
amb = amb.dropna() # Dropping None's
With that we've created a variable called amb that contains a pandas series of dictionaries with the same index of the original dataframe.
So now we can finally do:
temp = pd.DataFrame([*amb], amb.index) # Creating the temp dataframe where cols are the keys from the dictionaries
df = df.join(temp) # Joining with original dataframe