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

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

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

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

Q&A

解決済

2回答

1351閲覧

big data分割の際のバグでしょうか?

pickle

総合スコア16

Python

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

1グッド

0クリップ

投稿2020/05/09 23:44

お世話になります。
train,testというそれぞれ5000000,2000000列のデータを分割したいとindex毎にgroupに分けました。
しかし、分割した後の要素数がどのgroupも微妙にずれており、なぜこのずれが生じてしまうのか分かりません。以下の様になります。
本来ならばgroup0,1,2,3,4と要素数はキリがよくなっているはずなのですが・・・。
お分かりになる方いらっしゃいましたら、何卒ご教授お願いいたします。

python

1print(len(train)) #5000000 2print(len(test)) #2000000 3 4train["group"] = 0 5test["group"] = 0 6 7x = [[(0,500000),(500000,1000000)],[(1000000,1500000),(3000000,3500000)],[(1500000,2000000),(3500000,4000000)], 8 [(2500000,3000000),(4000000,4500000)],[(2000000,2500000),(4500000,5000000)]] 9for k in range(5): 10 for j in range(len(x[k])): train.loc[x[k][j][0]:x[k][j][1],"group"] = k 11 12y = [[(0,100000),(300000,400000),(800000,900000),(1000000,2000000)],[(400000,500000)], 13 [(100000,200000),(900000,1000000)],[(200000,300000),(600000,700000)],[(500000,600000),(700000,800000)]] 14for k in range(5): 15 for j in range(len(y[k])): test.loc[y[k][j][0]:y[k][j][1],"group"] = k 16 17for i in range(5): 18 print("***********************************") 19 print("group = " + str(i)) 20 print(len(train[train["group"] == i])) 21 print(len(test[test["group"] == i])) 22 print("***********************************") 23 24###output### 25*********************************** 26group = 0 271000000 281299997 29*********************************** 30*********************************** 31group = 1 32999999 33100000 34*********************************** 35*********************************** 36group = 2 371000000 38200001 39*********************************** 40*********************************** 41group = 3 421000000 43200000 44*********************************** 45*********************************** 46group = 4 471000001 48200002 49***********************************
siruku6👍を押しています

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

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

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

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

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

guest

回答2

0

各DataFrameにreset_index()を実施してから実行すると上手くいくような気がします。
※現在のDataFrameのindexに抜けてる番号はありませんか?

投稿2020/05/10 04:26

meg_

総合スコア10760

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

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

pickle

2020/05/10 09:54

> meg_さん ご指摘ありがとうございます。下記の通り、siruku6さんにご指摘いただいた通り、loc[x:y]だと、index x~yまで抽出される様です。そこがずれの原因でした。siruku6さんへの返信にも記載しましたが、iloc[x:y]とloc[x:y]でずれがある様です。 今後ともよろしくお願いいたします。
guest

0

ベストアンサー

.loc[x:y]は、indexのx番からy番まで取得するようです。

python

1train.loc[10000:20000] 2 3 4sample group 510000 10000 0 610001 10001 0 710002 10002 0 810003 10003 0 910004 10004 0 10... ... ... 1119996 19996 0 1219997 19997 0 1319998 19998 0 1419999 19999 0 1520000 20000 0 1610001 rows × 2 columns 17 18# ↑ 10001行取得した

というわけで、キリの良い値で切って欲しい場合はtrain.loc[10000:(20000 - 1)] のようにするのが正解っぽいです。

投稿2020/05/10 02:29

編集2020/05/10 02:31
siruku6

総合スコア1382

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

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

pickle

2020/05/10 09:52

> siruku6さん ご教授ありがとうございます。てっきりrange()と同じで.loc[x:y]とした場合には、index x ~ y-1まで抽出されるものかと思っていました。ご指摘いただいた方法でキリの良いデータとなりました!! 確認したところ、iloc[x:y]だと、index x~y-1までしか取り出されず、loc[x:y]とiloc[x:y]とにわずかにずれがある様でした。 今後ともよろしくお願いいたします。
siruku6

2020/05/10 11:08

loc と iloc が違うのは私も知りませんでした! これは勉強になりました。
pickle

2020/05/13 07:03

>siruku6さん 僕も勉強になりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問