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

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

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

Q&A

解決済

2回答

361閲覧

python pandas Dataframe 特定の列に合致する別の列の値を変更したい

dub

総合スコア23

0グッド

1クリップ

投稿2022/01/22 05:00

編集2022/01/22 08:35

2つのcsvファイル。
1つは商品台帳(全体)の10列のCSV。もう1つのCSVファイルは在庫数(3列)のCSVファイルがあります。

やりたいことは、在庫数のCSVファイルの値を、全体のCSVに 商品コードをKeyにして反映したいと思っています。

python3

1import pandas as pd 2df = pd.DataFrame({ 3 'code': ['item1','item2','item3','item4','item5','item6'], 4 'on_off': [1,1,1,1,1,1], 5 'stock': [1,1,1,1,1,1], 6 'detail': ['文字列','文字列','文字列','文字列','文字列','文字列'] 7}) 8print(df) 9(実際は10列だが単純化して4列。重要なのはもう1つのCSVとは列数が異なる) 10# code on_off stock detail 11#0 item1 1 1 文字列 12#1 item2 1 1  文字列 13#2 item3 1 1  文字列 14#3 item4 1 1  文字列 15#4 item5 1 1  文字列 16#5 item6 1 1  文字列 17 18df_stock=pd.DataFrame({ 19 'code': ['item2','item5','item3'], 20 'on_off': [1,0,1], 21 'stock': [4,8,19]}) 22print(df_stock) 23 24# code on_off stock 25#0 item2 1 4 26#1 item5 0 8 27#2 item3 1 10 28#3 item7 1 13 29 30在庫csvの特定の列の値 df_stock['stock']を 元の全体CSVのdf['stock']列に商品コードをkeyにして 31商品コードで合致した列の値を変更したいと思っています 32 33求める結果 元帳CSV(df) ※の部分を在庫CSVの値に変更したい 34# code on_off stock detail 35#0 item1 1 1 文字列 36#1 item2 1 ※4  文字列 37#2 item3 1 ※10  文字列 38#3 item4 1 1   文字列 39#4 item5 1 1   文字列 40#5 item6 1 ※8   文字列 41 42 43#item7のように 元帳に存在しないコードが 在庫CSVに存在する場合は 44※i「item7は元帳に存在しない旨 エラーを表示したい

自分でやった事。
いろいろ調べて たどり着いたのが、下記ページのwhere関数なのですが・
#Pandasで条件に合致した要素の置換を行うwhere関数の使い方
https://deepage.net/features/pandas-where.html

これが別の列の値・・を変更出来る方法ではないのかよくわからず・・

dfを辞書のようにkey操作するにはどうしたらいいものか・・

方向性でも教えていただけますと幸いです

追記 pandas find関数ですかね・・・もう一回自分でも考えてます・・
https://qiita.com/haru1977/items/2892480d31c296f2ec8e

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

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

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

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

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

meg_

2022/01/22 06:03

print(pridf_stock) のコードでNameErrorとなります。
dub

2022/01/22 06:52

御指摘ありがとうございます。修正しました print(df_stock)
guest

回答2

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': ['文字列','文字列','文字列','文字列','文字列','文字列'] 10}) 11 12df_stock=pd.DataFrame({ 13 'code': ['item2','item5','item3'], 14 'on_off': [1,0,1], 15 'stock': [4,8,19]}) 16 17# 18update = df.merge(df_stock, on='code', how='inner') 19df.loc[df['code'].isin(update['code']), 'stock'] = update['stock_y'].values 20 21print(df) 22# 23 code on_off stock detail 240 item1 1 1 文字列 251 item2 1 4 文字列 262 item3 1 19 文字列 273 item4 1 1 文字列 284 item5 1 8 文字列 295 item6 1 1 文字列

投稿2022/01/22 09:01

編集2022/01/22 09:29
melian

総合スコア19714

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

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

dub

2022/01/22 10:58

ありがとうございます!思ったとおりに出来ました。merge に 一部分だけ更新できるんですね!あとisinも理解しようとしてるのですが、まだ使いこなせてないので・・コードを使って復習します
guest

0

やりたいことは、在庫数のCSVファイルの値を、全体のCSVに 商品コードをKeyにして反映したいと思っています。

pandas.mergeが利用できるかと思います。

投稿2022/01/22 06:22

meg_

総合スコア10579

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

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

dub

2022/01/22 06:48

例は2つのdfが同じ列数となっておりましたが、実際は、元帳であるCSV(df)は 10列で、在庫数CSV(df_stock)は3列のCSVでした。 つまり2つの列数がまったく異なる・・ので pandas.mergeは使えない・・のではないでしょうか・・(前提情報が誤っており申し訳ありません。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問