質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

1回答

383閲覧

python3 pandas 2つのDFをmaskで商品コードをkeyで値を代入 →条件を入れたい(値が空白かnanの場合のみ代入するように)

dub

総合スコア23

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2022/04/28 05:10

編集2022/04/30 00:35

下記質問で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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

python

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# 19 20import numpy as np 21 22update = df.merge(df_stock, on='code', how='left') 23df['stock'] = ( 24 np.where(update['detail_x'] == '(空白)', update['stock_y'], update['stock_x']) 25 .astype(int)) 26 27print(df) 28 29# 30 code on_off stock detail 310 item1 1 1 文字列A 321 item2 1 4 (空白) 332 item3 1 19 (空白) 343 item4 1 1 文字列D 354 item5 1 1 文字列E 365 item6 1 1 文字列F

投稿2022/04/29 12:10

編集2022/04/30 03:50
melian

総合スコア19798

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dub

2022/04/30 00:41

頂いたコード・・では 下記結果となってしまいます numpy は触ったことないので、応用ができず・・ 頂いたコードをもとに、いろいろ触ったのですがわかりませんでした。。 code on_off stock detail 0 item1 1 1 1 1 item2 1 4 4 2 item3 1 19 19 3 item4 1 1 1 4 item5 1 8 8 5 item6 1 1 1
dub

2022/05/04 01:48

すみません。再度 変更頂いたコードも、いろいろ変更したのですが実現できませんでした。 頂いたコードの結果 code on_off stock detail 0 item1 1 1 文字列A 1 item2 1 4 (空白) 2 item3 1 19 (空白) 3 item4 1 1 文字列D 4 item5 1 1 文字列E 5 item6 1 1 文字列F print(df)  #求める結果。 item5のDFには値が入っているため、df_stockの値が代入されない #item2 item3 の該当列は 空白 なので df_stockの値が代入される code on_off stock detail 0 item1 1 1 文字列A 1 item2 1 4 文字列あ #←iDFの該当行が「空白の時のみ」maskでdf_stockの値が代入される 2 item3 1 19 文字列う #←DFの該当行が「空白の時のみ」maskでdf_stockの値が代入される 3 item4 1 1 文字列D 4 item5 1 8 文字列E #★←dfの文字列E がそのまま残る(値が入っている場合は代入されない) 5 item6 1 1 文字列F
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問