1
    year   fruit  sales
0  2010   Apple     10
1  2011   Apple     20
2  2010  Banans     50000
3  2011  Banans     30

What I want is like this:

    fruit   min_year  sales_2010  max_year  sales_2011
0   Apple       2010          10      2011          20
1   Banans      2010       50000      2011          30
user1633272
  • 1,797
  • 5
  • 21
  • 42

2 Answers2

3

First aggregate min and max to df1 with DataFrame.add_suffix, then pivoting by DataFrame.pivot with DataFrame.add_prefix and last join toghether by concat:

df1 = df.groupby('fruit')['year'].agg(['min','max']).add_suffix('_year')
df2 = df.pivot('fruit','year','sales').add_prefix('sales_')

df = pd.concat([df1, df2], axis=1)
print (df)
        min_year  max_year  sales_2010  sales_2011
fruit                                             
Apple       2010      2011          10          20
Banans      2010      2011       50000          30
jezrael
  • 729,927
  • 78
  • 1,141
  • 1,090
1

One option:

(df
 .pivot("fruit", "year", "sales")
 .assign(min_year=lambda df: df.columns.min(), 
         max_year=lambda df: df.columns[:-1].max())
 .rename(columns=lambda col: f"sales_{col}" 
                             if isinstance(col, int) 
                             else col)
 .rename_axis(columns=None)
 .reset_index()
)

    fruit  sales_2010  sales_2011  min_year  max_year
0   Apple          10          20      2010      2011
1  Banans       50000          30      2010      2011

Another option, that might be more efficient:

grouper = df.groupby('fruit')
(df
.assign(min_year=grouper.year.transform("min"), 
        max_year=grouper.year.transform("max"))
.pivot(["fruit", "min_year", "max_year"], "year", "sales")
.add_prefix("sales_")
.rename_axis(columns=None)
.reset_index()
)

    fruit  min_year  max_year  sales_2010  sales_2011
0   Apple      2010      2011          10          20
1  Banans      2010      2011       50000          30

sammywemmy
  • 22,944
  • 4
  • 14
  • 28