やろうとしていることが難しいことなので簡単にはできません。
前提として、同じ伝票番号の購入者は同一人物であることを仮定しています。
実用的な意味を考えて、ひとつの伝票番号の買ったものが3個以下であることは前提としないことにしました。そのために入力データを一つ増やしてあります。
入力データ
python
1>>> import pandas as pd
2>>> import numpy as np
3>>> print(df)
4 伝票番号 購入者氏名 買ったもの 個数 値段
50 1 母 卵 1 200
61 2 父 魚 1 300
72 5 母 水 1 100
83 3 母 野菜 1 200
94 4 父 お菓子 1 100
105 5 母 ジュース 1 150
116 5 母 お茶 1 150
127 6 父 酒 1 200
138 2 父 お肉 1 800
149 5 母 リンゴ 1 250
処理コード
python
1def order(df):
2 df['order'] = pd.RangeIndex(start=1, stop=len(df.index)+1)
3 return df
4
5df2 = df.groupby('伝票番号').apply(order)
6df2['買ったものorder'] = '買ったもの' + df2['order'].astype(str)
7df2['個数order'] = '個数' + df2['order'].astype(str)
8df3 = pd.concat([df2.pivot(index=('伝票番号', '購入者氏名'), columns='買ったものorder', values='買ったもの'),
9 df2.pivot(index=('伝票番号', '購入者氏名'), columns='個数order', values='個数')], axis=1)
10cols = df3.columns
11df4 = df3.reindex(columns=np.array(cols).reshape(2,len(cols)//2).T.reshape(len(cols)))
12df5 = pd.concat([df4, df.groupby(['伝票番号', '購入者氏名'])['値段'].sum()], axis=1)
13df6 = df5.reset_index()
14print(df6)
実行結果
python
1>>> print(df6)
2 伝票番号 購入者氏名 買ったもの1 個数1 買ったもの2 個数2 買ったもの3 個数3 買ったもの4 個数4 値段
30 1 母 卵 1.0 NaN NaN NaN NaN NaN NaN 200
41 2 父 魚 1.0 お肉 1.0 NaN NaN NaN NaN 1100
52 3 母 野菜 1.0 NaN NaN NaN NaN NaN NaN 200
63 4 父 お菓子 1.0 NaN NaN NaN NaN NaN NaN 100
74 5 母 水 1.0 ジュース 1.0 お茶 1.0 リンゴ 1.0 650
85 6 父 酒 1.0 NaN NaN NaN NaN NaN NaN 200
個数が整数ではなく浮動小数点数なのは、列も値のないことを示すNaNが入っている場合の仕様です。
あとは、df6をto_excelでExcelフォーマットで保存してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。