Я хочу разбить датафреймы на обучающие и тестовые наборы с диапазонами

import pandas as pd 
import numpy as np
data=[]
columns = ['A', 'B', 'C']
data = [[0, 10, 5], [0, 12, 5], [2, 34, 13], [2, 3, 13], [4, 5, 8], [2, 4, 8], [1, 2, 4], [1, 3, 4], [3, 8, 12],[4,10,12],[6,7,12]]

df = pd.DataFrame(data, columns=columns)
print(df)

#     A   B   C
# 0   0  10   5
# 1   0  12   5
# 2   2  34  13
# 3   2   3  13
# 4   4   5   8
# 5   2   4   8
# 6   1   2   4
# 7   1   3   4
# 8   3   8  12
# 9   4  10  12
# 10  6   7  12

Теперь я хочу создать два фрейма данных df_train и df_test таким образом, чтобы в одном наборе не было двух чисел столбца "C". например. в столбце C элемент 5 должен находиться либо в обучающем наборе, либо в тестовом наборе. Поэтому строки [0, 10, 5], [0, 12, 5], [2, 34, 13] либо перейдут в обучающий набор или набор тестов, но не в обоих. Этот выбор элементов столбца C должен быть сделан случайным образом.

Я застрял на этом шаге и не могу продолжить.

2 ответа

Первый sample твой дф, тогда groupby C получить cumcount различить дублированное значение в пределах одной группы.

s=df.sample(len(df)).groupby('C').cumcount()
s
Out[481]: 
5     0
7     0
2     0
1     0
0     1
6     1
10    0
4     1
3     1
8     1
9     2
dtype: int64
test=df.loc[s[s==1].index]
train=df.loc[s[s==0].index]
test
Out[483]: 
   A   B   C
0  0  10   5
6  1   2   4
4  4   5   8
3  2   3  13
8  3   8  12
train
Out[484]: 
    A   B   C
5   2   4   8
7   1   3   4
2   2  34  13
1   0  12   5
10  6   7  12

Вопрос не совсем ясен в том, как должен выглядеть ожидаемый вывод двух данных и набора тестовых наборов.

Во всяком случае, я постараюсь ответить.

Я думаю, что вы можете сначала отсортировать значения dataframe:

df_sorted = df.sort_values(['C'], ascending=[True])
print(df_sorted)

Out[1]:
    A   B   C
6   1   2   4
7   1   3   4
0   0  10   5
1   0  12   5
4   4   5   8
5   2   4   8
8   3   8  12
9   4  10  12
10  6   7  12
2   2  34  13
3   2   3  13

Затем разделите отсортированный кадр данных:

uniqe_c = df_sorted['C'].unique().tolist()
print(uniqe_c)

Out[2]:
[4, 5, 8, 12, 13]

train_set = df[df['C'] <= uniqe_c[2]]
val_set = df[df['C'] > uniqe_c[2]]
print(train_set)

# Train set dataframe

Out[3]:
   A   B  C
0  0  10  5
1  0  12  5
4  4   5  8
5  2   4  8
6  1   2  4
7  1   3  4

print(val_set)

# Test set dataframe

Out[4]:
    A   B   C
2   2  34  13
3   2   3  13
8   3   8  12
9   4  10  12
10  6   7  12

Из 11 образцов, после разделения, 6 образцов идут в набор поездов и 5 образцов идут в набор проверки. Итак, проверил и не пропустил выборки в общей сумме двух фреймов данных.

Другие вопросы по тегам