Criei o seguinte dataframe do pandas:
ds = {'col1':[1.0,2.1,2.2,3.1,41,5.2,5.0,6.1,7.1,10]}
df = pd.DataFrame(data=ds)
O dataframe se parece com isto:
print(df)
col1
0 1.0
1 2.1
2 2.2
3 3.1
4 41.0
5 5.2
6 5.0
7 6.1
8 7.1
9 10.0
Preciso criar uma partição aleatória de 80% / 20% do conjunto de dados e também preciso criar um campo (chamado buildFlag
) que mostra se um registro pertence à partição de 80% ( buildFlag = 1
) ou pertence à partição de 20% ( buildFlag = 0
).
Por exemplo, o dataframe resultante seria algo como:
col1 buildFlag
0 1.0 1
1 2.1 1
2 2.2 1
3 3.1 0
4 41.0 1
5 5.2 0
6 5.0 1
7 6.1 1
8 7.1 1
9 10.0 1
Os buildFlag
valores são atribuídos aleatoriamente.
Alguém pode me ajudar, por favor?
SOLUÇÃO (PANDAS + NUMPY)
Uma possível solução, que:
Primeiro, usando
np.random.choice
para escolher aleatoriamente 80% dosdf
índices sem substituição.A
df.index.isin
função então verifica o índice de cada linha para ver se ela foi selecionada.Por fim,
np.where
atribui 1 àFlag
coluna para os índices selecionados e 0 para os demais.SOLUÇÃO (PANDAS + SKLEARN)
Alternativamente, podemos usar a função
scikit-learn
'strain_test_split
:Primeiro, ele divide aleatoriamente os
df
índices do em dois grupos: 80% para treinamento e 20% para teste, conforme especificado portest_size=0.2
.Os índices de treinamento são extraídos usando
[0]
. Odf.index.isin
método então verifica quais índices pertencem ao conjunto de treinamento, produzindo um array booleano.Por fim, esse array booleano é convertido em inteiros (
1
forTrue
e0
forFalse
) usando.astype(int)
.Saída:
Usando
sample
ereindex
:Alternativamente, se seus índices forem únicos:
Saída:
Você também pode usar
shuffle
from , por exemplo,random
e a saída parece