How to convert elements in Series to Dataframe in python?

Question:

I’m new to python.

I got a Dataframe like this:

df = pd.DataFrame({'column_a' : [1, 2, 3], 
                   'conversions' : [[{'action_type': 'type1',
                                      'value': '1',
                                      'value_plus_10': '11'},
                                     {'action_type': 'type2',
                                      'value': '2',
                                      'value_plus_10': '12'}],
                                    np.nan, 
                                    [{'action_type': 'type3',
                                      'value': '3',
                                      'value_plus_10': '13'},
                                     {'action_type': 'type4',
                                      'value': '4',
                                      'value_plus_10': '14'}]]} )

where values in the column conversions is either a list or a NaN.

values in conversions looks like this:

print(df['conversions'][0])
>>> [{'action_type': 'type1', 'value': '1', 'value_plus_10': '11'}, {'action_type': 'type2', 'value': '2', 'value_plus_10': '12'}]

But it’s kinda hard to manipulate, so I want elements in conversions to be either a dataFrame or a NaN, like this:

print(df['conversions'][0])
>>>
  action_type value value_plus_10
0       type1     1            11
1       type2     2            12

print(df['conversions'][1])
>>> nan

print(df['conversions'][2])
>>>
  action_type value value_plus_10
0       type3     3            13
1       type4     4            14

Here’s what I tried:

df['conversions'] = df['conversions'].apply(lambda x : pd.DataFrame(x) if type(x)=='list' else x)

which works, but nothing really changes.

I could only find ways to convert a series to a dataframe, but what I’m trying to do is converting elements in a series to dataframes.
Is it possible to do? Thanks a lot!

Edit: Sorry for the unclear expected output , hope it’s clear now.

Asked By: Mark the otter

||

Answers:

You can apply the DataFrame constructor to the conversions columns:

df['conversions'] = df['conversions'].apply(lambda x: pd.DataFrame(x) if isinstance(x, list) else x)
print(df['conversions'][0])

Output:

  action_type value value_plus_10
0       type1     1            11
1       type2     2            12

Edit: it seems I misread your question (which is a bit unclear tbf) since you claim that this doesn’t get the expected result. Are you trying to get all elements in one df? In that case you can use concat:

df_out = pd.concat([
    pd.DataFrame(x) for x in df['conversions'] if isinstance(x, list)
])
print(df_out)

Output:

  action_type value value_plus_10
0       type1     1            11
1       type2     2            12
0       type3     3            13
1       type4     4            14
Answered By: Tranbi
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.