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

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

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

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

pandas

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

Q&A

解決済

1回答

1697閲覧

Pythonで "SettingWithCopyWarning"の警告が取り除けません

mm_mountain

総合スコア2

Python

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

pandas

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

0グッド

0クリップ

投稿2020/05/05 11:01

編集2020/05/05 12:59

前提・実現したいこと

Pythonの下記コードで "SettingWithCopyWarning"の警告が取り除きたいです。

下記リンクを参照してわかったこととしては、代入や参照が曖昧なためにでる警告のようですが、具体的にどう取り除けばよいかが分かりませんでした。copy()を使ったりしたのですが、どうもうまく取り除けませんでした。

初心者なので申し訳ありませんが、どう書くかを教えてもらえると、大変ありがたいです。

https://linus-mk.hatenablog.com/entry/2019/02/02/200000

発生している問題・エラーメッセージ

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy self._setitem_with_indexer(indexer, value)

該当のソースコード

Python3

1import numpy as np 2import pandas as pd 3import matplotlib.pyplot as plt 4%matplotlib inline 5 6cs_master = pd.read_csv("customer_master.csv") 7class_master = pd.read_csv("class_master.csv") 8 9cs_master.head() 10class_master.head() 11 12#文字列から日付へ変換 13cs_master["start_date"] = pd.to_datetime(cs_master["start_date"]) 14cs_master["end_date"] = pd.to_datetime(cs_master["end_date"]) 15cs_master["start_ym"] = cs_master["start_date"].dt.strftime("%Y%m") 16cs_master["end_ym"] = cs_master["end_date"].dt.strftime("%Y%m") 17 18#結合 19cs_join = pd.merge(cs_master, class_master, on="class", how="left") 20cs_join.head() 21 22#期間を出す 23from dateutil.relativedelta import relativedelta 24cs_join["calc_date"] = cs_join["end_date"] 25cs_join["calc_date"] = cs_join["calc_date"].fillna(pd.to_datetime("20190430")) 26cs_join["member_period"]= 0 27for i in range(len(cs_join)): 28 delta = relativedelta(cs_join["calc_date"].iloc[i],cs_join["start_date"].iloc[i]) 29 cs_join["member_period"].iloc[i] = delta.years*12 + delta.months 30cs_join[["start_date", "end_date", "calc_date", "member_period"]].head() 31

cs_join.head()

1 customer_id name class gender start_date end_date campaign_id is_deleted start_ym end_ym class_name price 20 OA832399 XXXX C01 F 2015-05-01 NaT CA1 0 201505 NaN オールタイム 10500 31 PL270116 XXXXX C01 M 2015-05-01 NaT CA1 0 201505 NaN オールタイム 10500 42 OA974876 XXXXX C01 M 2015-05-01 NaT CA1 0 201505 NaN オールタイム 10500 53 HD024127 XXXXX C01 F 2015-05-01 NaT CA1 0 201505 NaN オールタイム 10500 64 HD661448 XXXXX C03 F 2015-05-01 NaT CA1 0 201505 NaN ナイト 6000

cs_join[["start_date",

1 start_date end_date calc_date member_period 20 2015-05-01 NaT 2019-04-30 47 31 2015-05-01 NaT 2019-04-30 47 42 2015-05-01 NaT 2019-04-30 47 53 2015-05-01 NaT 2019-04-30 47 64 2015-05-01 NaT 2019-04-30 47

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

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

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

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

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

meg_

2020/05/05 11:22

エラー発生行を含めたエラーメッセージを掲載してください。
meg_

2020/05/05 11:24 編集

また、検証可能なデータ(DataFrameの元となるcsv等のデータ)も掲載されると回答しやすいです。
mm_mountain

2020/05/05 11:28

すみません、私の書き方が悪かったのですが、エラーは起きておらず、警告(warning)のみで、その警告メッセージはパス以外はすべて載せております(警告を理解して消しておかないと、どこか知らないところで今後ミスする可能性もあると思っての質問でした)。 何度か試したところ、下記のラインがないと、警告も出ないので、下記が影響していると考えています。 cs_join["member_period"].iloc[i] = delta.years*12 + delta.months 追記として十分でしょうか。
Yasumichi

2020/05/05 11:41

単なる警告であることは、理解しております。 例えば、delta は timedelta から来ているという理解で OK ですか? ある程度は予測できますが、質問者は、それぞれの変数にどんなデータが入っているか、想像するところから始まるわけです。 回答を得たければ、前提条件をもう少し提示した方が良いと思います。前の処理を見せたくなければ、変数の初期化を模擬していただければ、良いのかなと。
meg_

2020/05/05 12:00

エラーではなくWarningでしたね。失礼しました。 参考に、質問のコードを実行する前のcs_join.head()の結果を教えてもらえませんか?
meg_

2020/05/05 12:18

可能性ですが、cs_joinは他のDataFrameから作成されていたりしませんか?
mm_mountain

2020/05/05 13:01

すみません、初心者で質問もうまくできずに、ご迷惑をおかけしております。 前にあるコードをも含めて記載しました。練習用のテキストのサンプルデータですので、データ内容の開示は全く問題ありませんが、逆に分かりにくくなっていたら申し訳ありません。
mm_mountain

2020/05/05 13:09 編集

質問のコードを実行する前のcs_join.head()の結果も追記しました。(会員マスタ"cs_master"と入会キャンペーンマスタ"class_master"をひっつけた後のデータを"cs_join"としました)
guest

回答1

0

ベストアンサー

推測ですが、下記の``cs_join["member_period"].iloc[i]`部分を

Python

1for i in range(len(cs_join)): 2 delta = relativedelta(cs_join["calc_date"].iloc[i],cs_join["start_date"].iloc[i]) 3 cs_join["member_period"].iloc[i] = delta.years*12 + delta.months

cs_join.loc[i, "member_period"]にしてみたらどうでしょうか?

Python

1for i in cs_join.index: 2 delta = relativedelta(cs_join["calc_date"].iloc[i],cs_join["start_date"].iloc[i]) 3 cs_join.loc[i, "member_period"] = delta.years*12 + delta.months

投稿2020/05/05 13:25

meg_

総合スコア10760

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

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

mm_mountain

2020/05/05 15:16

ありがとうございます。警告きえました。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問