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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

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回答

1382閲覧

Pythonのfor文内でDataFrameに対するlocのスライスの値を指定した場合のエラーについて

Yu-Yokochi

総合スコア7

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

pandas

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

0グッド

0クリップ

投稿2021/08/29 04:33

前提・実現したいこと

Pythonにおいて長さ100のDataFrameを、91個の長さ10のDataFrameに分割したいです。
分割後のDataFrameの様子は、元のDataFrameの行番号を099とすると、
1個目: 行番号が0
9のDataFrame
2個目:  行番号が110のDataFrame


n個目:  行番号がn-1
n+8のDataFrame


91個目(最後):  行番号が90~99のDataFrame
のようになります。

現在のソースコード

Python

1import pandas as pd 2import numpy as np 3 4length_of_df = 10 5df = pd.DataFrame(np.random.rand(100, 5)) 6for i in range(100): 7 l = length_of_df 8 for start in range(len(df) - l + 1): 9 stop = start + l - 1 10 df = df.loc[start : stop] 11 print(df)

発生している問題

上記のコードに対するoutputが以下のようになっており、

Python

1df = df.loc[start : stop]

のstopが行番号9に固定されてしまっています。

Out

1 0 1 2 3 4 20 0.153793 0.962481 0.717504 0.287884 0.779153 31 0.363384 0.601769 0.245677 0.804652 0.624542 42 0.215894 0.599740 0.320573 0.275128 0.529112 53 0.295138 0.494984 0.890005 0.629905 0.946923 64 0.178760 0.327287 0.629538 0.620193 0.102324 75 0.566159 0.866883 0.096345 0.396161 0.530190 86 0.093056 0.065673 0.495912 0.238379 0.275772 97 0.663116 0.854800 0.788848 0.597375 0.018949 108 0.708484 0.083630 0.573115 0.602056 0.496587 119 0.984709 0.044723 0.637304 0.346227 0.014686 12 0 1 2 3 4 131 0.363384 0.601769 0.245677 0.804652 0.624542 142 0.215894 0.599740 0.320573 0.275128 0.529112 153 0.295138 0.494984 0.890005 0.629905 0.946923 164 0.178760 0.327287 0.629538 0.620193 0.102324 175 0.566159 0.866883 0.096345 0.396161 0.530190 186 0.093056 0.065673 0.495912 0.238379 0.275772 197 0.663116 0.854800 0.788848 0.597375 0.018949 208 0.708484 0.083630 0.573115 0.602056 0.496587 219 0.984709 0.044723 0.637304 0.346227 0.014686 22 0 1 2 3 4 232 0.215894 0.599740 0.320573 0.275128 0.529112 243 0.295138 0.494984 0.890005 0.629905 0.946923 254 0.178760 0.327287 0.629538 0.620193 0.102324 265 0.566159 0.866883 0.096345 0.396161 0.530190 276 0.093056 0.065673 0.495912 0.238379 0.275772 287 0.663116 0.854800 0.788848 0.597375 0.018949 298 0.708484 0.083630 0.573115 0.602056 0.496587 309 0.984709 0.044723 0.637304 0.346227 0.014686 31 0 1 2 3 4 323 0.295138 0.494984 0.890005 0.629905 0.946923 334 0.178760 0.327287 0.629538 0.620193 0.102324 345 0.566159 0.866883 0.096345 0.396161 0.530190 356 0.093056 0.065673 0.495912 0.238379 0.275772 367 0.663116 0.854800 0.788848 0.597375 0.018949 378 0.708484 0.083630 0.573115 0.602056 0.496587 389 0.984709 0.044723 0.637304 0.346227 0.014686 39 0 1 2 3 4 404 0.178760 0.327287 0.629538 0.620193 0.102324 415 0.566159 0.866883 0.096345 0.396161 0.530190 426 0.093056 0.065673 0.495912 0.238379 0.275772 437 0.663116 0.854800 0.788848 0.597375 0.018949 448 0.708484 0.083630 0.573115 0.602056 0.496587 459 0.984709 0.044723 0.637304 0.346227 0.014686 46 0 1 2 3 4 475 0.566159 0.866883 0.096345 0.396161 0.530190 486 0.093056 0.065673 0.495912 0.238379 0.275772 497 0.663116 0.854800 0.788848 0.597375 0.018949 508 0.708484 0.083630 0.573115 0.602056 0.496587 519 0.984709 0.044723 0.637304 0.346227 0.014686 52 0 1 2 3 4 536 0.093056 0.065673 0.495912 0.238379 0.275772 547 0.663116 0.854800 0.788848 0.597375 0.018949 558 0.708484 0.083630 0.573115 0.602056 0.496587 569 0.984709 0.044723 0.637304 0.346227 0.014686 57 0 1 2 3 4 587 0.663116 0.854800 0.788848 0.597375 0.018949 598 0.708484 0.083630 0.573115 0.602056 0.496587 609 0.984709 0.044723 0.637304 0.346227 0.014686 61 0 1 2 3 4 628 0.708484 0.083630 0.573115 0.602056 0.496587 639 0.984709 0.044723 0.637304 0.346227 0.014686 64 0 1 2 3 4 659 0.984709 0.044723 0.637304 0.346227 0.014686 66Empty DataFrame 67Columns: [0, 1, 2, 3, 4] 68Index: [] 697071中略 727374Empty DataFrame 75Columns: [0, 1, 2, 3, 4] 76Index: []

試したこと

locのスライスを指定しているコードを以下のように変更してみましたが出力は変わりませんでした。

Python

1df = df.loc[start :] 2df = df.loc[: stop]

この問題を解決し、はじめに述べたようなDataFrameの分割を実現するためにはどのような変更をすれば良いかがわからず困っています。
知見が浅く、周りに頼れる人もいないため、質問させていただくこととしました。
お手数おかけしますが、知恵をお貸しいただけないでしょうか。
よろしくお願いします。

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

Python3 in jupyter notebook

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

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

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

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

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

meg_

2021/08/29 04:42

質問タイトルが「Pythonのfor文内でDataFrameに対するlocのスライスの値を指定した場合のエラーについて」ですが、本文にエラーの記載がありません。どのようなエラーが発生したのでしょうか?
guest

回答2

0

以下の処理でdfを分割したものを再びdfに代入しているのでそこで期待している処理になっていないのかなと思いました。

python

1df = df.loc[start : stop] 2

分割したdfを違う変数にいれて処理する例を記載しました

import pandas as pd import numpy as np length_of_df = 10 df = pd.DataFrame(np.random.rand(100, 5)) l = length_of_df for start in range(len(df) - l + 1): stop = start + l - 1 df_10 = df.loc[start :stop] print(df_10)

投稿2021/08/29 05:11

holy_

総合スコア364

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

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

0

ベストアンサー

質問のコードにてエラーは発生しなかったため下記となるようなコードを書きました。

1個目: 行番号が0~9のDataFrame

2個目:  行番号が110のDataFrame


n個目:  行番号がn-1
n+8のDataFrame


91個目(最後):  行番号が90~99のDataFrame

Python

1import pandas as pd 2import numpy as np 3 4length_of_df = 10 5df = pd.DataFrame(np.random.rand(100, 5)) 6for i in range(len(df) - length_of_df + 1): 7 print(df.loc[i:i+10]) 8# 0 1 2 3 4 9#0 0.284687 0.568240 0.375481 0.644755 0.343097 10#1 0.115586 0.177685 0.941413 0.650600 0.785378 11#2 0.406949 0.260557 0.858080 0.102214 0.753076 12#3 0.642846 0.179590 0.221054 0.885146 0.614990 13#4 0.177255 0.972967 0.300050 0.130992 0.221452 14#5 0.884074 0.268106 0.685474 0.832122 0.202357 15#6 0.645945 0.983901 0.220805 0.841363 0.280878 16#7 0.999752 0.269829 0.750204 0.407877 0.138401 17#8 0.739335 0.830746 0.142455 0.135297 0.058801 18#9 0.041558 0.480557 0.710930 0.376299 0.367029 19#10 0.268364 0.826171 0.275786 0.580683 0.561907 20# 0 1 2 3 4 21#1 0.115586 0.177685 0.941413 0.650600 0.785378 22#2 0.406949 0.260557 0.858080 0.102214 0.753076 23#3 0.642846 0.179590 0.221054 0.885146 0.614990 24#4 0.177255 0.972967 0.300050 0.130992 0.221452 25#5 0.884074 0.268106 0.685474 0.832122 0.202357 26#6 0.645945 0.983901 0.220805 0.841363 0.280878 27#7 0.999752 0.269829 0.750204 0.407877 0.138401 28#8 0.739335 0.830746 0.142455 0.135297 0.058801 29#9 0.041558 0.480557 0.710930 0.376299 0.367029 30#10 0.268364 0.826171 0.275786 0.580683 0.561907 31#11 0.196489 0.188743 0.515563 0.354906 0.100794 32・・・

質問のコードにはいくつか問題点があります。

Python

1import pandas as pd 2import numpy as np 3 4length_of_df = 10 5df = pd.DataFrame(np.random.rand(100, 5)) 6for i in range(100): 7 l = length_of_df 8 for start in range(len(df) - l + 1): 9 stop = start + l - 1 10 df = df.loc[start : stop] 11 print(df)

df = df.loc[start : stop]dfを上書きしてしまっています。
・forループが二重になっているのはどういうロジックでしょうか?

投稿2021/08/29 04:52

編集2021/08/29 05:09
meg_

総合スコア10716

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

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

Yu-Yokochi

2021/08/29 09:44

dfの上書きをしていることにより思い通りの結果になっていなかったことについて納得しました。 また、思い通りの出力にならないことをエラーと間違って表記していたことについて、紛らわしい表現で申し訳ありませんでした。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問