Я хочу разбить датафреймы на обучающие и тестовые наборы с диапазонами
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 образцов идут в набор проверки. Итак, проверил и не пропустил выборки в общей сумме двух фреймов данных.