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