2017-05-16 7 views
3

データフレームを属性'ids'によって2つの互いに素なセットにランダムに分離する必要があります。たとえば、次のデータフレームを検討:私は2つを取得する必要がPandasデータフレームの非結合グループによるランダムサンプリング

df= 
Out[470]: 
      0  1  2  3  ids 
0  17.0 18.0 16.0 15.0  13.0 
1  18.0 16.0 15.0 15.0  13.0 
2  16.0 15.0 15.0 16.0  13.0 
131 12.0 8.0 21.0 19.0  14.0 
132  8.0 21.0 19.0 20.0  14.0 
133 21.0 19.0 20.0 9.0  14.0 
248  NaN NaN 12.0 11.0  17.0 
249  NaN 12.0 11.0 10.0  17.0 
250 12.0 11.0 10.0 NaN  17.0 
287  3.0 3.0 1.0 8.0  20.0 
288  3.0 1.0 8.0 3.0  20.0 
289  1.0 8.0 3.0 3.0  20.0 
413 21.0 7.0 16.0 18.0  25.0 
414  7.0 16.0 18.0 19.0  25.0 
415 16.0 18.0 19.0 18.0  25.0 
665 10.0 8.0 8.0 7.0  27.0 
666  8.0 8.0 7.0 9.0  27.0 
667  8.0 7.0 9.0 8.0  27.0 
790  NaN NaN 15.0 NaN  33.0 
791  NaN 15.0 NaN 10.0  33.0 
792 15.0 NaN 10.0 NaN  33.0 
812  NaN 16.0 NaN 17.0  34.0 
813 16.0 NaN 17.0 NaN  34.0 
814  NaN 17.0 NaN 13.0  34.0 
944  3.0 4.0 3.0 18.0  35.0 
945  4.0 3.0 18.0 18.0  35.0 
946  3.0 18.0 18.0 11.0  35.0 
1059 9.0 10.0 3.0 4.0  56.0 
1060 10.0 3.0 4.0 3.0  56.0 
1061 3.0 4.0 3.0 3.0  56.0 
    ... ... ... ...  ... 
10125 NaN 9.0 5.0 5.0 101317.0 
10126 9.0 5.0 5.0 5.0 101317.0 
10127 5.0 5.0 5.0 7.0 101317.0 

を(ランダムにいくつかのフラクションサイズで分離)idsない交差値とデータフレーム。

私は「非pandasian」な方法でそれを解決する方法を知っている:

  • ids
  • の一意の値がランダムに応じて2つの互いに素グループ
  • 選択行に一意の値を分割取得.isin()

を使用して2つのグループでidsの値は、私はいくつかのPAでそれを行うには、シンプルできちんとした方法があるかどうかを疑問に思って.sample()のようなndas組み込み関数?

答えて

4

from sklearn.model_selection import GroupShuffleSplit 

# Initialize the GroupShuffleSplit. 
gss = GroupShuffleSplit(n_splits=1, test_size=0.5) 

# Get the indexers for the split. 
idx1, idx2 = next(gss.split(df, groups=df.ids)) 

# Get the split DataFrames. 
df1, df2 = df.iloc[idx1], df.iloc[idx2] 
+0

これは本当にとても良い方法です - 私はそれを使用したことはありません。ヒントありがとう! – MaxU

2

UPDATE:

df1 = df.sample(frac=1).loc[df.ids % 2 == 0] 
df2 = df.loc[df.index.difference(df1.index)] 

OLD正しくない(それはIDを分離することを気にしない)答え:

あなたが最初sample(frac=1)を使用してDFをシャッフルして、np.split()を使用することができます:

df1, df2 = np.split(df.sample(frac=1), 2) 
分割を実行するために sklearn.model_selection.GroupShuffleSplitを使用して0
+0

@MaxU、おかげで、それは動作しません。私は両方のセットで同じ 'ids'を取得します。 –

+0

@ArnoldKlein、私は私の答えを更新しました - 確認してください... – MaxU

+0

素晴らしい!チャームとして働く! (私はパンダを学んでいるので、そのようなきれいなソリューションは非常に価値があります) –

関連する問題