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

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

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

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

Q&A

解決済

4回答

3453閲覧

文字型から数値型に変換する時にA value is trying to be set on a copy of a slice from a DataFrameが発生します。

shimamura999

総合スコア13

Python

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

0グッド

0クリップ

投稿2021/12/17 02:02

前提・実現したいこと

こんにちは

世田谷区の保育園データを加工して計算しようとしています。
計算した結果の列はできるのですがワーニングがでています。
ワーニングの消し方を教えてください。

下記の回答をみたのですがうまく対応できませんでした。

A value is trying to be set on a copy of a slice from a DataFrame
を解消して、データを文字列から数字に変換したい
https://teratail.com/questions/230241

エラーメッセージ

/var/folders/hq/wygr2ggd77n_fwljr_58fymm0000gp/T/ipykernel_53867/821116963.py:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
youga['4歳'] = youga['4歳'].astype(int)

該当のソースコード

youga

地域 4歳 5歳
用賀 615 613
用賀 638 603
用賀 647 642
用賀 339 306
用賀 290 337

youga.columns
Index(['地域・地区', '4歳', '5歳'], dtype='object')

youga['4歳'] = youga['4歳'].astype(int)

python 3.8.11

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

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

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

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

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

guest

回答4

0

行を抽出した結果だったりすると提示の警告が発生します。
エラー文にも記載されているように.locを使うと回避できますが
抽出条件など不明なこともあるので、比較的お手軽な解決策としてははcopyをとってそれに対して操作することです。

Python

1import pandas as pd 2 3df = pd.DataFrame({'n':[1,2,3,4], 's':list('1234')}) 4df2 = df[df['n'] <= 2] 5 6# SettingWithCopyWarning 7#df2['s'] = df2['s'].astype(int) 8 9# No Waring 10df2 = df2.copy() 11df2['s'] = df2['s'].astype(int) 12 13print(df2)

投稿2021/12/17 02:21

can110

総合スコア38341

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

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

shimamura999

2021/12/17 02:33

can110様 ありがとうございます。 無事解決できました。
guest

0

自己解決

can110様,ppaul様 ありがとうございます。
無事解決できました。

COPYを知らなかったの助かりました。
https://techacademy.jp/magazine/18988 Pythonでcopyを使う方法【初心者向け】
TechAcademyマガジン

ある書籍では
warnings.simplefilter('ignore')
を書きましょうと書いてありましたがキチンと警告は対応したほうがいいですね。

投稿2021/12/17 02:37

shimamura999

総合スコア13

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

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

0

こちらでは Pandas 1.3.5 を使用していますが、warning は表示されません。

Pandas のソースコードに以下のコメントが記載されています。

pandas/generic.py at master · pandas-dev/pandas · GitHub

This technically need not raise SettingWithCopy if both are view

(which is not # generally guaranteed but is usually True. However,

this is in general not a good practice and we recommend using .loc.

df.iloc[0:5]['group'] = 'a'

なので、以下の様にすると良いかもしれません。

python

1youga.iloc[:]['4歳'] = youga['4歳'].astype(int)

追記

エラー、ワーニングは発生しませんでしたが変換はされませんでした

Pandas 1.3.5 では int へ変換されます。

python

1>>> print(youga.dtypes) 2地域・地区 object 34歳 object 45歳 object 5dtype: object 6 7>>> youga.loc[:,'4歳'] = youga['4歳'].astype(int) 8>>> print(youga.dtypes) 9地域・地区 object 104歳 int64 115歳 object 12dtype: object

投稿2021/12/17 02:33

編集2021/12/17 03:26
melian

総合スコア20655

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

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

shimamura999

2021/12/17 02:42

melian様 ありがとうございます。 試してみたのですが変換されずobject型のままでした。 後でもう一度試してみます。
melian

2021/12/17 02:52

ごめんなさい、以下を試してみて貰えますか? youga.loc[:,'4歳'] = youga['4歳'].astype(int)
shimamura999

2021/12/17 03:02

コメントありがとうございます。 エラー、ワーニングは発生しませんでしたが変換はされませんでした。 melian様COPYで対応ができたのでもう大丈夫です。
melian

2021/12/17 03:06

はい、了解です。ただ、Pandas 1.3.5 ではこれで int に変換されます。
shimamura999

2021/12/17 03:23

コメントありがとうございます。 int に変換されました。 環境がpandas 1.3.3でしたので1.3.4にアップデートしました。 Anacondaの環境で作業をしているので Pandas はcondaでインストールしました。 condaでは1.3.5はまだリリースされていないかもしれませんね。 1.3.4ではint型に変換されますがワーニングがでるようになりました。 A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead
guest

0

yougaの作り方に問題があります。
とりあえず、以下に変更すればよいでしょう。

python

1youga = youga.copy() 2youga['4歳'] = youga['4歳'].astype(int) 3

投稿2021/12/17 02:15

ppaul

総合スコア24670

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

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

shimamura999

2021/12/17 02:33

ppaul様 ありがとうございます。 無事解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問