import pandas as pd wide = pd.DataFrame( { "region": ["North", "South"], "product": ["Widget", "Widget"], "q1_sales": [120, 90], "q2_sales": [135, 104], "q3_sales": [148, 110], } ) id_columns = ["region", "product"] value_columns = ["q1_sales", "q2_sales", "q3_sales"] long = wide.melt( id_vars=id_columns, value_vars=value_columns, var_name="quarter", value_name="sales_usd", ) expected_rows = len(wide) * len(value_columns) print(f"pandas {pd.__version__}") print() print("WIDE_DATA") print(wide.to_string(index=False)) print() print("LONG_DATA") print(long.to_string(index=False)) print() print("VERIFY_SHAPE") print(f"wide rows: {len(wide)}") print(f"value columns: {len(value_columns)}") print(f"expected long rows: {expected_rows}") print(f"actual long rows: {len(long)}") print(f"columns: {', '.join(long.columns)}") print() print("SALES_BY_QUARTER") print(long.groupby("quarter", sort=False)["sales_usd"].sum().to_string())