2016-12-12 6 views
0

私は12行×5列のデータフレーム(df)を持っています。各ラベルから1行をサンプリングし、3行×5列の新しいデータフレーム(df1)を作成します。次にdfから行をサンプリングする次回は、すでにdf1にあるものと同じものを選択しません。だから、すでにサンプリングされた行をdfから削除するにはどうしたらいいですか?データフレームのランダムにサンプリングされた行を削除して再度サンプリングするのを避けるには?

import pandas as pd 
import numpy as np 

# 12x5 
df = pd.DataFrame(np.random.rand(12, 5)) 
label=np.array([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]) 
df['label'] = label 


#3x5 
df1 = pd.concat(g.sample(1) for idx, g in df.groupby('label')) 


#My attempt. It should be a 9x5 dataframe 
df2 = pd.concat(f.drop(idx) for idx, f in df1.groupby('label')) 

DF

enter image description here

DF1

enter image description here

DF2

enter image description here

答えて

1

このDATAFRAMEを皮切り:あなたの最初のサンプルがこれです

df = pd.DataFrame(np.random.rand(12, 5)) 
label=np.array([1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]) 
df['label'] = label 

:第二のサンプルについては

df1 = pd.concat(g.sample(1) for idx, g in df.groupby('label')) 

、あなたはDFからDF1のインデックスをドロップすることができます。

pd.concat(g.sample(1) for idx, g in df.drop(df1.index).groupby('label')) 
Out: 
      0   1   2   3   4 label 
2 0.188005 0.765640 0.549734 0.712261 0.334071  1 
4 0.599812 0.713593 0.366226 0.374616 0.952237  2 
8 0.631922 0.585104 0.184801 0.147213 0.804537  3 

これではありませんインサイドオペレーション元のDataFrameは変更されません。それは単に行を削除し、コピーを返し、そのコピーからサンプルを返します。

df2 = df.drop(df1.index) 

をサンプルその後DF2から:あなたはそれが永続的なものにしたい場合は、行うことができます。

関連する問題