Python 将CSV文件拆分为两个具有相同条件的大小相等的组

Python 将CSV文件拆分为两个具有相同条件的大小相等的组,python,pandas,group-by,split,Python,Pandas,Group By,Split,关于这一点,有许多类似的问题,但没有一个与我的问题接近 我想将csv数据分成两组,两组长度相等,标准相同,这里是年龄。此外,更难的问题可能是将多个抽样标准结合起来,这可能是年龄、工作经验和管理经验,因此结果尽可能标准化 我知道这是一个NP(或更复杂的)优化问题,也许不会有一个封闭的形式或明确的答案,但一个足够的封闭将是好的 import random import csv import numpy as np import pandas as pd classlist = pd.read_cs

关于这一点,有许多类似的问题,但没有一个与我的问题接近

我想将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中实现这一点,有什么建议吗?有没有这样的抽样方法?
谢谢

我建议使用
train\u test\u split
stratify
选项,并且
test\u大小为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_列车
df_测试
的主要统计结果:

> 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

希望能有所帮助

我不认为优化是一个好的选择。您需要研究最近邻和配对匹配方法。你可以在网上找到很多关于这方面的信息。计算年龄总和并确定50%的值,然后按该值将数据集分成两组。如果有更多的标准,这可能会起到类似的作用。@JanChristofterasa,这看起来几乎像是一个50%的百分位,但同样,如果我把它分为两类,一类高于平均水平,另一类低于平均水平。我希望最后两组的平均值相同。一般来说,不可能确保两组的平均值相同。谢谢@Raphaele,但这种方法使用的是随机iid数据,分布是正态的。我们可以在我自己的数据上假设这一点吗?
train\u test\u split
with
stratify
选项依赖于
StratifyShuffleSplit
上的源代码。在
stratify
参数中加入多个变量相当于说一个类是这些变量(年龄、经验、man.exp)的唯一组合,并且将在此分类变量上进行分层。分层的目的是使该分类变量在两个样本中的比例相同。因此,如果某个类只有一个成员(例如,如果你只有一行,表示年龄、经验和管理经验的特定组合),那么它将不起作用。回答得很好,谢谢@Raphaele
> 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