Разделите файл CSV на две группы одинакового размера, имеющие критерии - PullRequest
1 голос
/ 19 апреля 2020

Есть много похожих вопросов по этому поводу, но ни один не был близок к моей проблеме.

Я хотел бы разделить данные CSV на две группы одинаковой длины, имеющие одинаковые критерии, вот возраст. Кроме того, более сложной проблемой могло бы быть объединение нескольких критериев для выборки, которые могут быть «Возраст и опыт работы» и «Опыт управления», чтобы результат был максимально нормализован.

Я понимаю, что это проблема оптимизации NP (или более сложной сложности), и, возможно, не будет закрытого или определенного ответа, но достаточно близко, было бы хорошо.

import random
import csv
import numpy as np
import pandas as pd

classlist = pd.read_csv('Classlist-Test.csv')
df = pd.DataFrame(classlist)
grouped = df.groupby(['Age'])

grouped.sum()
     Work Experience (Yrs)  Management Experience (Yrs)
Age
23                       1                            1
24                      14                            2
25                      15                            8
26                      42                           10
27                      44                            5
28                      30                            8
29                      21                            3
30                      19                            6
31                      44                           12
32                      37                            5
33                      31                            9
34                      21                           12
35                      18                            1
36                      24                            0
38                      21                            4
39                      35                           16
40                      28                           18
41                      15                            7
45                      49                           17
46                      20                           11
53                      25                           10

>>> df.mean()
Age                            30.158879
Work Experience (Yrs)           5.177570
Management Experience (Yrs)     1.542056
dtype: float64
>>> df.median()
Age                            28.0
Work Experience (Yrs)           4.0
Management Experience (Yrs)     0.0
dtype: float64
>>> df.std()
Age                            5.557843
Work Experience (Yrs)          4.580132
Management Experience (Yrs)    2.533848
dtype: float64

Есть предложения, как это сделать в Python? Есть ли метод выборки, который делает это? Спасибо

1 Ответ

2 голосов
/ 20 апреля 2020

Я предлагаю использовать train_test_split с опцией stratify, а test_size = 0,5 следующим образом:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

np.random.seed(123)
df = pd.DataFrame({"Age": np.random.randint(0,50,10000),
                   "work_exp" : np.random.randint(0,3,10000),
                   "man_exp" : np.random.randint(0,3,10000),
                   "value": np.random.randint(0,2,10000)})
df_train, df_test = train_test_split(df, test_size=0.5, 
                                     stratify=df[["Age", "work_exp", "man_exp"]], random_state=0)

Вот результат для основной статистики как df_train, так и df_test:

> df_train.describe()
              Age     work_exp     man_exp        value
count  5000.000000  5000.000000  5000.00000  5000.000000
mean     24.516600     1.014200     1.01520     0.493400
std      14.453107     0.820812     0.81431     0.500006
min       0.000000     0.000000     0.00000     0.000000
25%      12.000000     0.000000     0.00000     0.000000
50%      24.000000     1.000000     1.00000     0.000000
75%      37.000000     2.000000     2.00000     1.000000
max      49.000000     2.000000     2.00000     1.000000
> df_test.describe()
              Age     work_exp      man_exp       value
count  5000.00000  5000.000000  5000.000000  5000.00000
mean     24.47900     1.011200     1.009400     0.51000
std      14.45663     0.819762     0.815503     0.49995
min       0.00000     0.000000     0.000000     0.00000
25%      12.00000     0.000000     0.000000     0.00000
50%      24.00000     1.000000     1.000000     1.00000
75%      37.00000     2.000000     2.000000     1.00000
max      49.00000     2.000000     2.000000     1.00000

Надеюсь, это поможет

...