关于在数据帧上覆盖逻辑数组

时间:2018-08-14 22:38:25

标签: python-3.x pandas numpy

有一个代码段,火车是形状为(10000,24)的数据框。我不太了解具体的代码行X_train = train[msk].iloc[:,features]train[mask]打算做什么?

train = pandas.read_csv(train_file)
msk = np.random.rand(len(train)) < 0.8
features = [3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23]
X_train = train[msk].iloc[:,features]

1 个答案:

答案 0 :(得分:0)

这是将数据集train分成大约80-20的非常无效的方法。它会创建一个布尔数组,其中的true和true分别约为80%和80%。

为了说明,请举这个玩具示例:

# Create a train dataframe
train = pd.DataFrame(np.random.random((10,4)))
>>> train
          0         1         2         3
0  0.514717  0.570628  0.315088  0.610563
1  0.070222  0.392518  0.222532  0.316044
2  0.002166  0.628661  0.871658  0.919967
3  0.487811  0.948827  0.862359  0.288661
4  0.473024  0.143987  0.318512  0.180763
5  0.438993  0.060274  0.603310  0.643926
6  0.115308  0.797109  0.716390  0.385135
7  0.591124  0.772243  0.185121  0.775700
8  0.994233  0.126579  0.560132  0.424696
9  0.417475  0.778452  0.403525  0.510491

# Create your mask
mask = np.random.rand(10) < 0.8

>>> mask
array([ True,  True,  True,  True, False, False, False,  True,  True,
        True])

如您所见,mask大约为 80%True,因为它会创建一个介于0和1之间的随机统一值数组,然后查找这些值在0.8以上的位置。由于它们是随机均匀分布的,因此大约80%的值将高于0.8

然后,您的代码用这些布尔值屏蔽数据框的选定列,选择掩码中索引等于True的那些行:

# Select relevant features
features = [0,1,2]

# Mask the relevant features of train dataframe with your mask
X_train = train[mask].iloc[:,features]
>>> X_train
          0         1         2
0  0.514717  0.570628  0.315088
1  0.070222  0.392518  0.222532
2  0.002166  0.628661  0.871658
3  0.487811  0.948827  0.862359
7  0.591124  0.772243  0.185121
8  0.994233  0.126579  0.560132
9  0.417475  0.778452  0.403525

请注意,如何只选择掩码中索引为True的行。它省略了第4、5和6行,因为这些索引在掩码中为False。同样,它仅选择我们在features中选择的列。

更好的方法是使用train_test_split中的sklearn。或者,您可以只使用train[features].sample(frac=0.8),它会做同样的事情,但是至少保证80%的分割:

>>> train[features].sample(frac=0.8)
          0         1         2
3  0.487811  0.948827  0.862359
7  0.591124  0.772243  0.185121
2  0.002166  0.628661  0.871658
9  0.417475  0.778452  0.403525
6  0.115308  0.797109  0.716390
1  0.070222  0.392518  0.222532
4  0.473024  0.143987  0.318512
0  0.514717  0.570628  0.315088