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

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

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

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

pandas

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

Q&A

解決済

1回答

7223閲覧

繰り返しでdataframeに行を追加したい

EKA

総合スコア26

Python 3.x

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

pandas

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

0グッド

1クリップ

投稿2022/02/17 05:22

編集2022/02/17 06:34

実現したいこと

表題の通りです。
入れ子のループで空のdataframeに行を追加したいです。

ソースコード

python

1for k in range (len(sample)): 2 df = pd.DataFrame () 3 for l in range(N): 4 df.iloc[l,:] = df_c.iloc[len(sample)*l + k,:]

sampleはstr型の単語がいくつか入っているリストで、
Nは整数です。

df_cはfloat型の数字が格納されていて、indexはsampleのリストがN回繰り返されているものです。

エラー内容

IndexError: iloc cannot enlarge its target object

と出ます。
新しい行として追加したいのですが、printで確認したところ、k =0かつl=0でエラーになっています。

ilocやlocは新しい行(もしくは列)を指定すれば、そこに追加する認識で、これまでもこの認識でうまくいっていたのですが、enlargeできないとのことで、そこに齟齬があるのでしょうか?

初心者でつたない説明で恐縮ですが、ご教授の程よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

df_cのindexはsampleがN回連続しているリスト?でした。

そうなりますと、以下の様になります。

python

1import pandas as pd 2import random 3 4sample = ["apple", "orange", "banana", "strawberry", "grape"] 5N = 3 6data = [random.randint(0, 50) for _ in range(len(sample)*N)] 7df_c = pd.DataFrame(data, index = sample*N) 8 9dfs = [] 10for k in range (len(sample)): 11 df = df_c.iloc[[len(sample)*l+k for l in range(N)],:] 12 dfs.append(df) 13 14print(f'df_c:\n{df_c}\n') 15print(f'{len(dfs) = }\n') 16for i in range(len(sample)): 17 print(f'dfs[{i}]:\n{dfs[i]}\n') 18 19# 20df_c: 21 0 22apple 31 23orange 15 24banana 36 25strawberry 25 26grape 14 27apple 28 28orange 37 29banana 37 30strawberry 43 31grape 32 32apple 38 33orange 42 34banana 20 35strawberry 35 36grape 10 37 38len(dfs) = 5 39 40dfs[0]: 41 0 42apple 31 43apple 28 44apple 38 45 46dfs[1]: 47 0 48orange 15 49orange 37 50orange 42 51 52dfs[2]: 53 0 54banana 36 55banana 37 56banana 20 57 58dfs[3]: 59 0 60strawberry 25 61strawberry 43 62strawberry 35 63 64dfs[4]: 65 0 66grape 14 67grape 32 68grape 10

投稿2022/02/17 06:13

編集2022/02/17 07:02
melian

総合スコア19714

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

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

EKA

2022/02/17 06:32

ご回答ありがとうございます。 大変恐縮なのですが、df_cのindexはsampleがN回連続しているリスト?でした。 df_cはブラウザで手打ちで定義したため間違えていました。申し訳ありません。 df_cのindexが(前述にように)Nごとのsampleという順番(0-Nのループの後にsampleのループがあるイメージ?)になっているのですが、これからsampleごとのdf(index=0-N)を作って、全sampleで繰り返したいです。 かなりわかりにくい説明だとは思いますが、エラーについて心当たりはございますでしょうか?
melian

2022/02/17 07:05

一行づつ追加しなくても、以下の様にして必要な全ての行を抽出することができます。 df_c.iloc[[len(sample)*l+k for l in range(N)],:] エラーについてはエラーメッセージにある通り、iloc メソッドでは存在しない行への割当てができません(loc メソッドでは可能ですが、この場合ではインデックスがバッティングしてしまいます)。
EKA

2022/02/17 07:51 編集

ilocは追加できないんですね、、、お陰様で該当箇所は解決しました。 ただ、同じindexを使うのはよくないですね、、、 sampleリストに枝番を振って最初から作り直してみます。 暖かいご助言ありがとうございました。 (追記) コードまで訂正いただいていたのに気づいておりませんでした、、 大変ありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問