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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

Q&A

解決済

1回答

489閲覧

Pandasで、2つのデータフレームを照合して、条件にあったデータを抽出し数値を代入したい

hp9100i

総合スコア4

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

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

0グッド

0クリップ

投稿2022/08/13 17:42

前提・実現したいこと

Pandasで、2つのデータフレームを照合して、条件にあったデータを抽出し数値を代入したいです。

実現したいこと

2つのデータフレームにある店舗IDと営業IDを照合して、営業DATAの欠損値になっている増加率を増加率表から抽出して数値を代入したい

df=
営業DATA

店舗ID営業ID顧客ID増加率
2021-12-1806004220509NaN
2021-12-2701006410507NaN
2021-11-0506006410609NaN
2021-04-0805006600354NaN
2021-06-0903006660502NaN
2021-10-2304006522503NaN
2021-07-0609006410503NaN
2021-09-1307006602059NaN
2021-12-0108006602507NaN
2021-08-3009004222008NaN
2021-12-0502006662405NaN
2021-09-2105006602507NaN
2021-08-1901006661290NaN
2021-05-0510004225209NaN
2021-02-1301006667290NaN
2021-03-1509004222007NaN
2021-01-2810006662666NaN

df1=
増加率表(縦軸:店舗ID 横軸:営業id)

0042200652006600066600641
010.000.000.000.430.35
020.000.000.000.000.29
030.110.210.000.330.00
040.160.070.100.310.00
050.120.080.000.170.18
060.090.140.450.180.11
070.100.000.110.120.23
090.050.400.200.360.28
100.290.000.180.200.34

想定する完成DATA

店舗ID営業ID顧客ID増加率
2021-12-18060042205090.09
2021-12-27010064105070.35
2021-11-05060064106090.11
2021-04-08050066003540.00
2021-06-09030066605020.33
2021-10-23040065225030.07
2021-07-06090064105030.28
2021-09-13070066020590.11
2021-12-01040066025070.10
2021-08-30090042220080.05
2021-12-05020066624050.00
2021-09-21050066025070.00
2021-08-19010066612900.43
2021-05-05100042252090.29
2021-02-13010066672900.43
2021-03-15090042220070.05
2021-01-28100066626660.20

1件1件を手入力だと以下の文で書き換わったのですが、100万行の手入力は流石に無理ですので何とか自動化出来ないかと挑戦してみました

df["増加率"] = df["増加率"].mask((df["店舗ID"]=="10") & (df["営業ID"]=="00666"), "0.20")

しかし、当方の技量不足により以下の文を書いたところで行き詰まりました。

tenpo_list = ['01', '02', '03', '04', '05', '06', '07', '09', '10'] eigyou_list = ['00422', '00652', '00660', '00666', '00641'] for tenpo in tenpo_list: df["増加率"] = df["増加率"].mask((df["店舗ID"]=="tenpo") & (df["営業ID"]=="eigyou"), "zouka")

試したこと

if文やfor文を使ってみたり、変数を増やしてみたりしたのですが、全然できませんでした。
初心者で試したことも少ないのですが、よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

※ df1(増加率表)には店舗IDが 08 の行が存在しないので対応する増加率は nan になります。

python

1import pandas as pd 2import io 3 4df_data = ''' 5店舗ID,営業ID,顧客ID,増加率 62021-12-18,06,00422,0509, 72021-12-27,01,00641,0507, 82021-11-05,06,00641,0609, 92021-04-08,05,00660,0354, 102021-06-09,03,00666,0502, 112021-10-23,04,00652,2503, 122021-07-06,09,00641,0503, 132021-09-13,07,00660,2059, 142021-12-01,08,00660,2507, 152021-08-30,09,00422,2008, 162021-12-05,02,00666,2405, 172021-09-21,05,00660,2507, 182021-08-19,01,00666,1290, 192021-05-05,10,00422,5209, 202021-02-13,01,00666,7290, 212021-03-15,09,00422,2007, 222021-01-28,10,00666,2666, 23''' 24df = pd.read_csv(io.StringIO(df_data), dtype=str) 25 26df1_data = ''' 2700422,00652,00660,00666,00641 2801,0.00,0.00,0.00,0.43,0.35 2902,0.00,0.00,0.00,0.00,0.29 3003,0.11,0.21,0.00,0.33,0.00 3104,0.16,0.07,0.10,0.31,0.00 3205,0.12,0.08,0.00,0.17,0.18 3306,0.09,0.14,0.45,0.18,0.11 3407,0.10,0.00,0.11,0.12,0.23 3509,0.05,0.40,0.20,0.36,0.28 3610,0.29,0.00,0.18,0.20,0.34 37''' 38df1 = pd.read_csv(io.StringIO(df1_data), dtype=str).astype(float) 39 40# 41df['増加率'] = df.merge(df1.stack().to_frame(), 42 left_on=["店舗ID", "営業ID"], right_index=True, how='left')[0] 43 44print(df)
店舗ID営業ID顧客ID増加率
2021-12-18060042205090.09
2021-12-27010064105070.35
2021-11-05060064106090.11
2021-04-08050066003540
2021-06-09030066605020.33
2021-10-23040065225030.07
2021-07-06090064105030.28
2021-09-13070066020590.11
2021-12-0108006602507nan
2021-08-30090042220080.05
2021-12-05020066624050
2021-09-21050066025070
2021-08-19010066612900.43
2021-05-05100042252090.29
2021-02-13010066672900.43
2021-03-15090042220070.05
2021-01-28100066626660.2

投稿2022/08/14 01:15

編集2022/08/14 01:33
melian

総合スコア19695

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

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

hp9100i

2022/08/14 13:22

ありがとうございます ものすごく助かりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問