1

I have a dataframe that has keys in one column and values in another column. I'm trying to find a way to make this into a 3 column dataframe. But....if I'm missing a 1 or 2 key value, I want pandas to populate an N/A.

What I have:

   | key | Number |
   +-----+--------+
   |   0 |     10 |
   |   1 |     20 |
   |   2 |     30 |
   |   0 |     40 |
   |   1 |     50 |
   |   2 |     60 |
   +-----+--------+



What I want:

+---------+---------+---------+
| Column1 | Column2 | Column3 |
+---------+---------+---------+
|      10 |      20 |      30 |
|      40 |      50 |      60 |
+---------+---------+---------+





Seyi Daniel
  • 2,259
  • 2
  • 8
  • 18

2 Answers2

3

You can also, do this using dataframe reshaping:

df.set_index([df.groupby('key').cumcount(), 'key'])['Number']\
  .unstack()\
  .rename(columns=lambda x: f'Column{x+1}')

Output:

key  Column1  Column2  Column3
0         10       20       30
1         40       50       60

Or

df.assign(row=df.groupby('key').cumcount())\
  .pivot('row','key','Number')\
  .rename(columns=labmda x: f'Column{x+1}')

Output:

key  Column1  Column2  Column3
row                           
0         10       20       30
1         40       50       60
Scott Boston
  • 147,308
  • 15
  • 139
  • 187
1

You can create a new DataFrame using a dict-comprehension over a groupby:

>>> df
   key  Number
0    0      10
1    1      20
2    2      30
3    0      40
4    1      50
5    2      60
>>> pd.DataFrame({"Column{}".format(k+1):list(v) for k,v in df.Number.groupby(df.key)})
   Column1  Column2  Column3
0       10       20       30
1       40       50       60
Hampus Larsson
  • 3,050
  • 2
  • 14
  • 20