【Pandas】上の行と下の行の値を比較して一致確認できたら、上の行の値から下の行のNaNに置換したい

Pandasを勉強中の者です。
以下、初歩的な内容と思いますが、ご教授願います。

実現したいこと

対象となる基データ

日時 果物 値段 個数
2024/06/11 18:00:00 バナナ 150 100
2024/06/11 18:00:00 バナナ 150 NaN
2024/06/11 18:10:10 りんご 200 150
2024/06/11 18:10:10 りんご 200 NaN
2024/06/11 18:30:30 りんご 100 300
2024/06/11 18:30:30 りんご 100 NaN
2024/06/11 18:40:40 すいか 500 NaN
2024/06/11 18:50:50 ぶどう 600 50
2024/06/11 18:50:50 ぶどう 600 NaN

期待するデータ

日時 果物 値段 個数
2024/06/11 18:00:00 バナナ 150 100
2024/06/11 18:00:00 バナナ 150 100
2024/06/11 18:10:10 りんご 200 150
2024/06/11 18:10:10 りんご 200 150
2024/06/11 18:30:30 りんご 100 300
2024/06/11 18:30:30 りんご 100 300
2024/06/11 18:40:40 すいか 500 NaN
2024/06/11 18:50:50 ぶどう 600 50
2024/06/11 18:50:50 ぶどう 600 50

上の行と下の行の日時・果物・値段の値を比較して、完全一致確認できたら、下行のNaNを上行の値を取得して置換したい。
for文を使って、ループ処理しながら上の行と下の行を確認して置換する方法もあるが、最大行となると出力に時間がかかるため避けたい。

該当のソースコード

python

1import pandas as pd 2import io 3 4csv_data = ''' 5日時,果物,値段,個数 62024/06/11 18:00:00,バナナ,150,100 72024/06/11 18:00:00,バナナ,150, 82024/06/11 18:10:10,りんご,200,150 92024/06/11 18:10:10,りんご,200, 102024/06/11 18:30:30,りんご,100,300 112024/06/11 18:30:30,りんご,100, 122024/06/11 18:40:40,すいか,500, 132024/06/11 18:50:50,ぶどう,600,50 142024/06/11 18:50:50,ぶどう,600, 15'''16 17df = pd.read_csv(io.StringIO(csv_data), dtype=str)18df['日時'] = pd.to_datetime(df['日時'])19 20datetime_match = df['日時'] != df['日時'].shift(-1)21fruits_match = df['果物'] != df['果物'].shift(-1)22price_match = df['値段'] != df['値段'].shift(-1)23 24df['個数'] = df['個数'].mask(datetime_match & fruits_match & price_match, df['個数'].shift(1))25 26print(df)

試したこと

24行目のshift関数つかって色々試みましたが、期待するデータのように出力しません。

上記コードから出力結果

日時 果物 値段 個数
2024-06-11 18:00:00 バナナ 150 100
2024-06-11 18:00:00 バナナ 150 100
2024-06-11 18:10:10 りんご 200 150
2024-06-11 18:10:10 りんご 200 NaN
2024-06-11 18:30:30 りんご 100 300
2024-06-11 18:30:30 りんご 100 300
2024-06-11 18:40:40 すいか 500 NaN
2024-06-11 18:50:50 ぶどう 600 50
2024-06-11 18:50:50 ぶどう 600 50

コメントを投稿

0 コメント