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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

3882閲覧

pandasにおけるデータフレームのコピーについて

animegazer

総合スコア13

Python 3.x

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

Python

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

pandas

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

1グッド

1クリップ

投稿2019/02/20 08:21

困っているというか、気になったこと

pandasにおけるデータフレームのコピーの挙動について質問があります。

まず、データフレームを複製したい場合には
df2 = dfではdf2がdfへのリンク(ポインタ?)になってしまうので、
df2 = df.copy()というようにする、ということはわかりました。

(参考)
pandasのDataFlameのコピーは”=”じゃだめ
pandasで=でコピーした場合とcopy()を使った場合の挙動の違い
<Python, pandas> DataFlame.copy()

しかし、copyなしの=だけでも複製できるケースがあることに気付きました。

該当のソースコード

まず、複製できていないケースの=です。

Python

1df = pd.DataFrame(data=[(0,1),(2,3)]) 2df2 = df 3df2.iloc[0,0]=9999 4print(df) 5print(df2)

Output

1(df) 2 0 1 30 9999 1 41 2 3 5(df2) 6 0 1 70 9999 1 81 2 3

これは先程述べたように上手くいっていません。

しかし、次のように書いた場合、

Python

1df = pd.DataFrame(data=[(0,1),(2,3)]) 2df2 = df[[True,True]] 3df2.iloc[0,0]=9999 4print(df) 5print(df2)

Output

1(df) 2 0 1 30 0 1 41 2 3 5(df2) 6 0 1 70 9999 1 81 2 3

と、何故か上手くいっています……。
ちなみに、df2 = df[:]ではうまくいきませんでした。

どなたか、この辺の挙動について、ご説明いただけないでしょうか……?

magichan👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

pandas は numpy と同じで boolean indexing や fancy indexing の場合はコピーを返します。
df.values.base is df2.values.base で df と df2 の参照するデータが同じかどうか確認できます。

def is_view(df1, df2): return df.values.base is df2.values.base df2 = df print(is_view(df, df2)) # True df2 = df[:] print(is_view(df, df2)) # True # slice df2 = df[::2] print(is_view(df, df2)) # True # boolean indexing df2 = df[[True, False, True, True, True]] print(is_view(df, df2)) # False # fancy indexing df2 = df[[1, 2, 4]] print(is_view(df, df2)) # False # operation df2 = df + 2 print(is_view(df, df2)) # False

要求された配列をストライドの調整で返すことができる場合はビューになりますが、そうでない場合はコピーになります。

投稿2019/02/20 13:39

tiitoi

総合スコア21956

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

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

animegazer

2019/02/21 02:46

ありがとうございます!numpyから引き継いでいる仕様なんですね。 boolean indexing や fancy indexingは(使ってはいたものの)言葉を知らなかったので助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問