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

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

2回答

568閲覧

【python】pandasのデータフレームでfor文を回し、新たな列を追加する方法

tanaka_tarou63

総合スコア9

Python 3.x

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

Python

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

pandas

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

0グッド

0クリップ

投稿2023/02/09 08:54

実現したいこと

  • データフレームでfor文を回して値を取得し、その値を元に取得した新たな値を各行に追加していく

詳細

(A)のようなデータフレームがあるとき、1行ずつ処理して値を取得し、取得した値を元に新たに取得した値を各行に追加して(B)のようなデータフレームを作りたいですが、
(C)のように上手く追加されません。
原因を教えていただけますと幸いです。

※実際は別の関数を使用して返された値を追加したいのですが、簡略化のため下記のようなデータになっています。
色々といじる中で、追加されるパターンとされないパターンがあることが分かりましたので、ご教示いただけますと幸いです。

(A)初期データ

int_
00
11
22
33
44

(B)作りたいデータ

int_str_
000
111
222
333
444

(C)実際に作成されたデータ

int_str_
00
11
22
33
44

該当のソースコード

Python

1import pandas as pd 2 3df = pd.DataFrame({'int_': range(5)}) 4 5df["str_"] = "" 6for i,(index,row) in enumerate(df.iterrows()): 7 row["str_"] = str(i) 8 9print(df)

試したこと

データフレームをリストで作成した下記データフレームだと上手く作成されたのですが、何が違うのかがわからないので、こちらもご教示いただけますと幸いです。

Python

1import pandas as pd 2 3df = pd.DataFrame({'hiragana': ['あ','い','う','え','お']}) 4 5df["str_"] = "" 6for i,(index,row) in enumerate(df.iterrows()): 7 row["str_"] = str(i) 8 9print(df)

作成されたデータ

hiraganastr_
00
11
22
33
44

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

melian

2023/02/09 09:13

df["str_"] = df.index.astype(str) ではダメなのでしょうか?
guest

回答2

0

※実際は別の関数を使用して返された値を追加したい

一般的にpandasではforループで逐次処理をする必要はありませんし、速度面なども考えるとやらないほうがよいです。
そのかわりに、その関数をapplyで行毎に呼び出し、その結果を追加したい列にセットすればよいです。

Python

1import pandas as pd 2 3df = pd.DataFrame({'hiragana': ['あ','い','う','え','お']}) 4 5# 何らかの処理 6def func(row): 7 return f'{row.name}_{row["hiragana"]}' 8 9df['_str'] = df.apply(func, axis=1) 10print(df) 11""" 12 hiragana _str 130 あ 0_あ 141 い 1_い 152 う 2_う 163 え 3_え 174 お 4_お 18"""

投稿2023/02/10 01:25

can110

総合スコア38256

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

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

0

下記リファレンスのNotesを参照ください。
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.iterrows.html

You should never modify something you are iterating over. This is not guaranteed to work in all cases. Depending on the data types, the iterator returns a copy and not a view, and writing to it will have no effect.

iterrows() でループしているときの各行が、元のデータフレームのコピーになっている場合とビューになっている場合があります。ビューの場合は、ループ中のrowを変更すると、元のデータフレームも変更されますが、コピーの場合は変更されません。
列のdtypeが異なる場合(今回の例の上のもの、intとobject)は確実にコピーです。
列のdtypeが同じ場合(今回の例の下のもの、objectとobject)だとビューになる場合もありますが、必ずビューになるということは保証されていません。

以下のように、インデックスを使って、データフレームを直接変更するようにすればいいです。
(もっと効率的に書けるケースが多いですが)

python

1for i,(index,row) in enumerate(df.iterrows()): 2 df.loc[index, "str_"] = str(i)

投稿2023/02/10 01:01

bsdfan

総合スコア4560

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問