Can dataframe’s cells hold nested dictionary as value?

Viewed 67

dict:

meta_data = {
                "attr1":"meta_value1", 
                "attr2": {
                             "key1": "value1",
                             "key2": "value2",
                             "key3": "value3",
                         },
             }

then I want to create a dataframe by doing this:

df = pd.DataFrame({"df_key1": "df_value1", "df_key2": "df_value2", 
                   "df_key3": "df_value3", "meta_data": meta_data}, index[0])

I got:

        df_key1        df_key2        df_key3        meta_data
0       df_value1      df_value2      df_value3      NaN

columns 'meta_data' valued NaN.

I also tried

df_dict = {"df_key1": "df_value1", "df_key2": "df_value2", 
           "df_key3": "df_value3", "meta_data": meta_data}

df = pd.DataFrame.from_dict(df_dict)

I got:

            df_key1        df_key2        df_key3        meta_data
attr1       df_value1      df_value2      df_value3      meta_value1
attr2       df_value1      df_value2      df_value3      {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}

what I really want is:

        df_key1        df_key2        df_key3        meta_data
0       df_value1      df_value2      df_value3      {'attr1': 'meta_value1', 'attr2': {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}}

a nested dictionary as the value in dataframe's cell,

what should I do?


All answers can solve my problem, I picked the most agreeable one for myself, thank you all.

If you have any suggestions from any reasonable perspectives like code style or else welcome to comment.

3 Answers

use pd.Series then pd.DataFrame


df = pd.Series({"df_key1": "df_value1", "df_key2": "df_value2", 
                  "df_key3": "df_value3", "meta_data": meta_data})
df.to_frame().T

You should try creating dataframe with key value pairs using .items() from dictionary.

Setup:

import pandas as pd

meta_data = {
                "attr1":"meta_value1", 
                "attr2": {
                             "key1": "value1",
                             "key2": "value2",
                             "key3": "value3",
                         },
             }


df_dict = {"df_key1": "df_value1", "df_key2": "df_value2", 
           "df_key3": "df_value3", "meta_data": meta_data}

And this will give the required dataframe:

pd.DataFrame({k: [v] for k, v in df_dict.items()})

Upon changing the DataFrame creation , wrapping meta_data inside a list solves the required output -

>>> df_dict = {"df_key1": "df_value1", "df_key2": "df_value2","df_key3": "df_value3", "meta_data": [meta_data]}
>>> df = pd.DataFrame.from_dict(df_dict)
>>> df
     df_key1    df_key2    df_key3                                          meta_data
0  df_value1  df_value2  df_value3  {'attr1': 'meta_value1', 'attr2': {'key1': 'va...
>>> df.meta_data.values
array([{'attr1': 'meta_value1', 'attr2': {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}}],
      dtype=object)
Related