MatheMarco
MatheMarco

Reputation: 13

Pivot Tables with Pandas

I have the following data saved as a pandas dataframe

Animal Day age Food  kg  
 1      1   3   17   0.1 
 1      1   3   22   0.7
 1      2   3   17   0.8
 2      2   7   15   0.1

With pivot I get the following:

output = df.pivot(["Animal", "Food"], "Day", "kg") \
           .add_prefix("Day") \
           .reset_index() \
           .rename_axis(None, axis=1)

>>> output
   Animal  Food  Day1  Day2
0       1    17   0.1   0.8
1       1    22   0.7   NaN
2       2    15   NaN   0.1

However I would like to have the age column (and other columns) still included. It could also be possible that for animal x the value age is not always the same, then it doesn't matter which age value is taken.

    Animal  Food Age Day1  Day2
0       1    17   3   0.1   0.8
1       1    22   3   0.7   NaN
2       2    15   7   NaN   0.1

How do I need to change the code above?

Upvotes: 0

Views: 50

Answers (2)

mozway
mozway

Reputation: 260335

IIUC, what you want is to pivot the weight, but to aggregate the age.

To my knowledge, you need to do both operations separately. One with pivot, the other with groupby (here I used first for the example, but this could be anything), and join:

(df.pivot(index=["Animal", "Food"],
          columns="Day",
          values="kg",
         )
   .add_prefix('Day')
   .join(df.groupby(['Animal', 'Food'])['age'].first())
   .reset_index()
 )

I am adding a non ambiguous example (here the age of Animal 1 changes on Day2).

Input:

   Animal  Day  age  Food   kg
0       1    1    3    17  0.1
1       1    1    3    22  0.7
2       1    2    4    17  0.8
3       2    2    7    15  0.1

output:

   Animal  Food  Day1  Day2  age
0       1    17   0.1   0.8    3
1       1    22   0.7   NaN    3
2       2    15   NaN   0.1    7

Upvotes: 1

Corralien
Corralien

Reputation: 120391

Use pivot, add other columns to index:

>>> df.pivot(df.columns[~df.columns.isin(['Day', 'kg'])], 'Day', 'kg') \
      .add_prefix('Day').reset_index().rename_axis(columns=None)

   Animal  age  Food  Day1  Day2
0       1    3    17   0.1   0.8
1       1    3    22   0.7   NaN
2       2    7    15   NaN   0.1

Upvotes: 0

Related Questions