下記質問で2つのCSVファイルがあり
pandas dataframe のmask関数を使って 1つのファイルの値を、codeをKeyにして
値を元のCSVから移行先のCSVに 値を代入する方法の解答を得ました。
https://teratail.com/questions/dstr1z84wlql1o
その時に解答いただいたコードに プラスして 条件を入れたいのです
元の df の該当列に「値が入っていた場合は」 df_stockの値を代入しない。dfの値を残す
要するに df の該当 の 列が 「空白」(値なし)の場合のみ、df_stockの値を代入したいのです。
pyton3
1import pandas as pd 2 3pd.set_option('display.unicode.east_asian_width', True) 4 5df = pd.DataFrame({ 6 'code': ['item1','item2','item3','item4','item5','item6'], 7 'on_off': [1,1,1,1,1,1], 8 'stock': [1,1,1,1,1,1], 9 'detail': ['文字列A','(空白)','(空白)','文字列D','文字列E','文字列F'] 10}) 11 12df_stock=pd.DataFrame({ 13 'code': ['item2','item5','item3'], 14 'on_off': [1,0,1], 15 'stock': [4,8,19], 16'detail': ['文字列あ','文字列い','文字列う'] 17}) 18# 19update = df.merge(df_stock, on='code', how='inner') 20df.loc[df['code'].isin(update['code']), 'stock'] = update['stock_y'].values 21df.loc[df['code'].isin(update['code']), 'detail'] = update['detail_y'].values 22 23 24print(df) 25#現在の数値 26 code on_off stock detail 270 item1 1 1 文字列A 281 item2 1 4 文字列あ #←df_stockの値が代入されている) 292 item3 1 19 文字列う#←df_stockの値が代入されている) 303 item4 1 1 文字列D 314 item5 1 8 文字列い #←df_stockの値が代入されている) 325 item6 1 1 文字列F 33 34print(df) 35#求める結果。 item5のDFには値が入っているため、df_stockの値が代入されない 36#item2 item3 の該当列は 空白 なので df_stockの値が代入される 37 code on_off stock detail 380 item1 1 1 文字列A 391 item2 1 4 文字列あ #←iDFの該当行が「空白の時のみ」maskでdf_stockの値が代入される 402 item3 1 19 文字列う #←DFの該当行が「空白の時のみ」maskでdf_stockの値が代入される 413 item4 1 1 文字列D 424 item5 1 8 文字列E #★←dfの文字列E がそのまま残る(値が入っている場合は代入されない) 435 item6 1 1 文字列F
##考えたこと
IF文を使うのか・・と考えたのですが、教えていただいた方法では mergeを使って 一旦 dfとdf_stockを 結合しており、その中から 該当のコードがあったら 値を代入する。
と すでに上記で 条件が入っているような・・
df.loc[df['code'].isin(update['code']), 'stock'] = update['stock_y'].values
上記のコードの どこに空白行を判定する IF文を入れるのかが、さっぱり想像つきません。
i
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/04/30 00:41
2022/05/04 01:48