S.Al
S.Al

Reputation: 45

Pandas dataframe issue

I have this dictionary:

d = {1 : [ '2' , 'Pepsi' ], 3 : [ '1' , 'Pepper' ]}

df = pd.DataFrame([[slide, i[0], i[1]] for slide, item in d.items() for i in
item], columns=['Slide', 'Level', 'Level Title'])

I want to have the following output:

slide   level    'level1 title'   'level2 title'
1       2                          Pepsi
3       1         Pepper

So far, my code outputs this:

slide   level    'level title'
1       2         Pepsi
3       1         Pepper

Basically when the first item in the list is 1, the second item in the list should go to 'level1 title', and when the item is 2, the second item should go to 'level2 title'

Upvotes: 3

Views: 52

Answers (2)

LondonRob
LondonRob

Reputation: 78683

I'd suggest you start with your DataFrame like you have already got:

slide   level    level_title
1       2         Pepsi
3       1         Pepper

Add a couple of columns with nothing in them:

In [24]: df['level1'] = pd.np.nan

In [25]: df['level2'] = pd.np.nan

Then set the values as needed with some conditional wizardry:

In [40]: df.loc[df['level'] == 2, 'level1'] = df.level_title

In [41]: df.loc[df['level'] == 1, 'level2'] = df.level_title

In [42]: df
Out[42]: 
   slide  level level_title level1  level2
0      1      2       Pepsi  Pepsi     NaN
1      3      1      Pepper    NaN  Pepper

(Spot the 'deliberate' mistake that I put the levels and the titles the wrong way round. But you get the idea!)

Upvotes: 1

Anand S Kumar
Anand S Kumar

Reputation: 90869

If there are only two levels, then you can use list comprehension , like this -

In [12]: df = pd.DataFrame([[slide, item[0], item[1], ''] if item[0] == '1' else [slide, item[0], '', item[1]] 
for slide, item in d.items()], columns=['Slide', 'Level', 'Level1 Title', 'Level2 Title'])

In [13]: df
Out[13]:
   Slide Level Level1 Title Level2 Title
0      1     2                     Pepsi
1      3     1       Pepper

Upvotes: 1

Related Questions