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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

Q&A

解決済

2回答

1805閲覧

データフレームの指定行にデータを挿入したい

jun.k

総合スコア28

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

0グッド

1クリップ

投稿2018/01/18 12:19

下記データフレームdftの指定した行の下にデータを追加したいのですが。

.. Store Dept Date Weekly_Sales IsHoliday Type Size Temperature
0 1 1 2010-02-05 24924.5 False    A 151315 42.31
1 1 1 2010-02-12 46039.4 True    A 151315 38.51
2 1 1 2010-02-19 41595.5 False    A 151315 39.93
3 1 1 2010-02-26 19403.5 False    A 151315 46.63

Store列は1-45まで、Dept列は1-99まであります。Store番号毎にDeptが基本1-99まであるのですが、欠番となっているStore-Deptがあるため、該当の行を作りたい(たとえばStoreが5でDeptが99の列がない場合、Store=5、Dept=98の最下行(Store=5、Dept=98に該当するものは複数行ある場合あり)に新たな行Store=5、Dept=99を作り、残りの列は前行の値を使う)と考えています。

挿入すべき行が20ぐらいあるため、できれば簡潔に挿入する方法をご教示いただけませんでしょうか。

よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

とりあえず、

Python

1dummy_df = pd.DataFrame(list(itertools.product(range(1,46),range(1,100))), 2 columns=['Store','Dept'])

のようにして、予め StoreDept Columnのデータを全て埋めた DataFrame を作成しておき、この DataFrame に元のDataFramemerge() し、最後にデータが入らなかった箇所をfillna()で埋めるとよいのではないでしょうか。

以下は動作確認のコードです。
(Store:1~3, Dept:1~3 の範囲のデータで確認しております)

Python

1import itertools 2import pandas as pd 3import numpy as np 4 5# 適当なサンプルデータ 6df = pd.DataFrame({'Store':[1,1,2,2,3,3], 7 'Dept':[1,2,2,3,1,3], 8 'Date': pd.date_range('2010-02-05',periods=6, freq='10d'), 9 'Weekly_Sales':np.random.rand(6)}) 10 11dummy_df = pd.DataFrame(list(itertools.product(range(1,4),range(1,4))), 12 columns=['Store','Dept']) 13 14new_df = pd.merge(dummy_df, df, on=['Store', 'Dept'], how='left').fillna(method='ffill') 15print(new_df)

投稿2018/01/19 01:53

magichan

総合スコア15898

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

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

jun.k

2018/01/19 02:43

いつもありがとうございます。動き方が欲分からない箇所があるのですが、とりあえずコードをそのまま適用して見たところ、確かにすべて埋まりました! ただなくても良いStore Deptがあるのでこれを消すにはdropで個別にやるしか思い当たらないのですが、件数が膨大で・・・・ほかに方法はありますでしょうか。ちなみにデータを差し込みたいStore-Deptの組み合わせは下記の通り分かっております。 5-99,9-99,10-99,18-43,24-43,25-99,34-39,36-30,37-30,42-30,45-39
jun.k

2018/01/19 03:02

すみません。単にlist(iterの部分を[[5,99],[9,99]・・・・]に変えて、mergeのhowをouterにすればよいのでしょうか。これであっていそうでしたが
magichan

2018/01/19 04:17

既知のデータを何個か追加したいのであれば、その方法でもよいかもしれません。 ただ、その場合は順番が崩れますので、sort_values(['Store', 'Dept']) した後に fillna() をする必要がありますね。(reset_index() もしたほうがよいかも) new_df = pd.merge(dummy_df, df, on=['Store', 'Dept'], how='outer') new_df = new_df.sort_values(['Store', 'Dept']).reset_index(drop=True).fillna(method='ffill')
jun.k

2018/01/19 06:25

ありがとうございます。ご指摘の方法でうまくいきました!!!
guest

0

既に解決済みでが
1)pd.concatで追加したいデータを縦連結
2).sort_valus(['Store','Dept'])で並び替え
3).reset_index()でインデックスの付け替え
というのもありました。なんのひねりも工夫もありませんね。しかもあらかじめ、StoreとDeptを決める必要があって複雑そうです

投稿2018/01/19 05:13

編集2018/01/19 05:17
R.Shigemori

総合スコア3376

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

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

jun.k

2018/01/19 06:28

ありがとうございます!! でも今回の場合はこれで解決できる問題でした。初級者なのでなかなか思いつかずいろんな方法が分かることは非常に勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問