Python 将CSV文件拆分为两个具有相同条件的大小相等的组
关于这一点,有许多类似的问题,但没有一个与我的问题接近 我想将csv数据分成两组,两组长度相等,标准相同,这里是年龄。此外,更难的问题可能是将多个抽样标准结合起来,这可能是年龄、工作经验和管理经验,因此结果尽可能标准化 我知道这是一个NP(或更复杂的)优化问题,也许不会有一个封闭的形式或明确的答案,但一个足够的封闭将是好的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
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
withstratify
选项依赖于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