実現したいこと
CSVファイルのデータを下記の内容で処理させたい。
- リスト同じ取引番号のデータごとで処理をさせたい。
- 取引区分が0で1行のみの時は取引区分が2の行の明細1から明細3までを取引区分が0の明細1から明細3に張り付ける。
- 同じ取引番号で取引区分が0が複数行あるときは取引区分2の行の入金金額から明細3までを取引区分が0の行に張り付ける。
- 取引区分に21が入っている行は削除
前提
Python(python-3.12.2)でCSVデータを処理するプログラムを作っています。
描いている結果が得られなくて詰まっています。
コードについてアドバイスをいただければと思います。
よろしくお願いいたします。
CSVファイルの中身です。
取引番号,取引トランザクション,取引区分,価格,入金金額,明細1,明細2,明細3
1,1,3,0,,,,
2,2,0,1000,,,,
2,3,2,0,,商品A,カテゴリA,10kg
3,4,0,1000,,,,
3,5,0,1000,,,,
3,6,0,1000,,,,
3,7,2,0,3000,商品B,カテゴリB,500kg
4,8,0,1000,,,,
4,9,0,1000,,,,
4,10,0,1000,,,,
4,11,0,1000,,,,
4,12,0,1000,,,,
4,13,2,0,5000,商品C,カテゴリC,90kg
5,14,0,1000,,,,
5,15,21,0,,,,
5,16,2,0,,,,
発生している問題・エラーメッセージ
該当のソースコード
Python
1import pandas as pd 2 3df = pd.read_csv('datafile.csv', encoding='cp932') 4 5df = df[(df['取引区分'] != 21) & (df['取引区分'] != 3)].reset_index(drop=True) 6 7 8# 取引番号でグループ化する 9for _, group in df.groupby('取引番号'): 10 # グループ内の最後の行を取得 11 last_row = group.iloc[-1] 12# 明細1明細2明細3のコピー処理。逆順処理 13for index in group.index[::-1]: 14 15 next_col_index = df.columns.get_loc('明細3') + 1 16 if next_col_index < len(df.columns): # 'マルチ決済金額'の次の列が存在する場合 17 next_col_name = df.columns[next_col_index] 18 df.loc[index, '入金金額':next_col_name] = last_row['入金金額':'明細3'] 19 else: # 'マルチ決済金額'が最後の列の場合 20 df.loc[index, '入金金額':] = last_row['入金金額':'明細3'] 21 22# 変更を加えたデータフレームを新しいCSVファイルとして保存 23df.to_csv('updated_datafile.csv', index=False)
回答2件
あなたの回答
tips
プレビュー