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

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

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

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

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

Python

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

Q&A

解決済

2回答

372閲覧

python データフレーム 要素 変更

tttkkk

総合スコア38

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/06/02 09:55

pythonを勉強しており、データフレームでの要素の扱いについて
疑問が生じたためお伺いさせていただきました。

データフレームで特定のカラムをリストとして抽出してのち、
そのリストの要素に変更を加えると元のデータフレームの要素まで変更されるのはどうしてなのでしょうか。

実行環境は以下になります。
Python 3.7.13
Windows10
google colab

文面では非常に分かりづらいとも思いますので、以下にサンプルコードを記載いたします。
下記のコードを実行しますと最初のデータフレームは1枚目の画像のようなデータフレーム、
二番目のデータフレームは2枚目の画像となります。

python

1!pip install pandas 2import pandas as pd 3df = pd.DataFrame( 4 data = [['x', 'y', 'z'], 5 [10, 20, 30], 6 [100, 200, 300]] 7) 8 9df #最初のデータフレーム 10 11lists = df[0].values 12print(type(lists)) 13 14for i in range(len(lists)): 15 if lists[i] == 10: 16 lists[i] = lists[i] + 100000 17 18df #二番目のデータフレーム

ここで私としては最初のデータフレームからカラム「0」をリストとして抽出して、
そのリストの中にある10に対して100000を足したという認識であって、
最初のデータフレームに対して変更を加えたという認識はありません。

しかし、二番目のデータフレーム(実際には最初のデータフレームを再表示)しますと、
10であった要素が100010に変更されています。

これはどういう処理で上記の現象が起きているのでしょうか。
データフレームから抽出したリストのデータ型がnumpy.ndarray型であると相互作用のような形になるのでしょうか。

稚拙な質問かとは思いますが、教えて頂けますと幸いです。

イメージ説明
イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

pandas.Series.values

Warning

We recommend using Series.array or Series.to_numpy(), depending on whether you need a reference to the underlying data or a NumPy array.

そこで、pandas.Series.to_numpy を眺めてみると、

Series.to_numpy(dtype=None, copy=False, na_value=NoDefault.no_default, **kwargs)

Parameters

copy: bool, default False

Whether to ensure that the returned value is not a view on another array. Note that copy=False does not ensure that to_numpy() is no-copy. Rather, copy=True ensure that a copy is made, even if not strictly necessary.

なので、numpy.ndarray 型のコピーが欲しい場合には pandas.Series.to_numpy(copy=True), リストでも構わない場合は pandas.Series.to_list() を使用するとよろしいかと思います。

python

1##lists = df[0].values 2lists = df[0].to_numpy(copy=True) 3#lists = df[0].to_list() 4print(type(lists)) 5for i in range(len(lists)): 6 if lists[i] == 10: 7 lists[i] = lists[i] + 100000 8print(df) 9 10# 11 0 1 2 120 x y z 131 10 20 30 142 100 200 300 15<class 'numpy.ndarray'> 16 0 1 2 170 x y z 181 10 20 30 192 100 200 300

投稿2022/06/02 13:04

melian

総合スコア19803

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

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

tttkkk

2022/06/02 13:59

ご回答いただきありがとうございます。 公式だとそのように一応案内がされているのですね。 英語というのもあって深く読んではおりませんでした。 やはり単純にカラムを抽出するだけですと、元のデータフレームも変更されてしまうpythonの仕様だということが理解することができました。
guest

0

データフレームで特定のカラムをリストとして抽出してのち、そのリストの要素に変更を加えると元のデータフレームの要素まで変更されるのはどうしてなのでしょうか。

そういう仕様だからです。

pythonのデータの多くは、変数はその値を持っているのでなく、参照しています。
以下のbはaと同じものを指しているので、aを変更するとbも変更されているように見えます。
cはaに入っているもののコピーを指しているので変更されません。(あたりまえ。)

DataFrameも同じです。
別の実体にしたいのであれば、コピーをしてください。

python

1a = [1, 2, 3] 2b = a 3 4c = a.copy() 5 6a[1] = 9 7 8print(b) 9# > [1, 9, 3] 10print(c) 11# > [1, 2, 3]

投稿2022/06/02 10:45

編集2022/06/02 14:34
TakaiY

総合スコア12765

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

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

tttkkk

2022/06/02 13:55

回答していただきありがとうございます。 理解の足らない質問で申し訳ございませんが、 TakaiY様のコードの中で c が突然出てきております。 この c は a をコピーしたものだということですが、 c = a ではなくて、別の方法で c に a をコピーしたということでしょうか。
TakaiY

2022/06/02 14:33

ああ、ごめんなさい。漏れていました。修正します。
tttkkk

2022/06/02 22:08

やっと理解することができました。 今まではvbaを少し勉強しておりましたが、確かvbaではそのような仕様にはなってなかったような気がして、 疑問に思いましたが、納得できました。 ご丁寧に教えていただきありがとうございます。 申し訳ないところですが、ベストアンサーは公式を参照して教えていただいたmelian様にさせていただきたく思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問