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

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

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

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

pandas

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

Q&A

解決済

1回答

1761閲覧

[python] pandasでデータ追加

ji-desuji

総合スコア11

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2020/10/17 01:48

編集2020/10/17 01:49

前提・実現したいこと

pandasを勉強中です。
DataFrameとして、Excelを読み込んで、指定した行にシリーズを追加したいです。

code1で実行すると、columns名:priceの列は追加できるのですが、
price_listのデータが追加されず、NaNとなってしまいます。
code2のようにindexをset, resetするとなぜか、price_listのデータが追加されます。
"df="もつけないと、データが追加されません。

なぜcode2だと、price_listのデータが追加できるのか教えて頂けますでしょうか?

該当のソースコード

python

1#【code1】 2df = pd.read_excel('test.xlsx') 3df = df[df['month'] >= 202004] 4price_list=[100, 2000, 3000, 400] 5s = pd.Series(price_list) 6df.insert(2, 'price', s) 7 8#【code2】 9df = pd.read_excel('test.xlsx') 10df = df[df['month'] >= 202004] 11######### 12df = df.set_index('item') 13df = df.reset_index() 14######### 15a=[100, 2000, 3000, 400] 16s = pd.Series(price_list) 17df.insert(2, 'price', s)

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

win10
vs code
python 3.8

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

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

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

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

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

meg_

2020/10/17 01:59

どのようなExcelシートでしょうか?
guest

回答1

0

ベストアンサー

pandasのデータフレームにシリーズを列として追加するさい、データフレームの行インデックスとシリーズのインデックスが比較されます

たとえば、insertで指定した位置に新たな列を挿入する場合、

  • 行インデックスと一致するシリーズのインデックスが見つかれば、データフレームにそのインデックスを持つシリーズの値が挿入されます。
  • 行インデックスと一致するシリーズのインデックスが見つからなければ、データフレームにはNaNが挿入されます。
  • シリーズの中に行インデックスに一致しないインデックスがあっても、そのインデックスを持つ値は単に無視されます(np.arrayを指定するときのようにエラーにはなりません)。

提示されたコードのようにExcelの文書ファイルを読み込むと、データフレームdfの行インデックスは0から始まる連番が自動的に付きます。
month列の値を使ってデータフレームの一部を切り出したものをデータフレームdfに再代入しても、データフレームの行インデックスは元の連番を受け継ぎます。Excelの文書ファイルの内容が未公開なので推測にすぎませんが、おそらく最初の行インデックスが3より大きな値になっていると思われます。

いっぽう、提示されたコードのようにリストprice_listからシリーズsを生成すると、シリーズの各要素には0から始まる連番のインデックスが付きます。提示されたコードでは、リストが4つの要素を持つので、シリーズのインデックスは0, 1, 2, 3となります。

これをinsertdfに挿入するとき、dfの行インデックス(3より大きい値)にsのインデックス(0~3)と一致するものがないので、挿入される値がすべてNaNになる、というわけです。もし、dfの行インデックスのひとつだけ3以下であれば、シリーズの値がひとつだけ格納され、残りはNaNになります。

先頭行から順番にシリーズsの内容を挿入したいのであれば、(質問者もやっていましたが)データフレームdfの行インデックスを(0からの連番に)振り直せばいいでしょう。実は、この操作は1行でできるので、以下のようにしてください。

Python

1df.reset_index(drop=True, inplace=True)

drop=Trueで元の行インデックスの値を列として残さないこと、inplace=Truedfそのものを書き換えること(df = df.reset_index(...)と書かなくていいこと)を指示しています。

投稿2020/10/17 03:07

編集2020/10/17 03:15
Daregada

総合スコア11990

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

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

ji-desuji

2020/10/17 04:18

非常に分かりやすい説明ありがとうございます!納得できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問