Sklearn StratifiedShuffleSplit与熊猫

时间:2016-04-05 19:00:23

标签: python pandas scikit-learn

我正在尝试从熊猫数据框制作培训和测试集。我跑的时候:

sss = StratifiedShuffleSplit(df['event'], n_iter=3, test_size=0.2)

我收到错误:

ValueError: The least populated class in y has only 1 member, which is too few. The minimum number of labels for any class cannot be less than 2.

然而事实并非如此,因为当我跑步时:

df.event.value_counts()

我明白了:

irrelevant    5030
event         394

知道什么可能导致这个问题吗?

1 个答案:

答案 0 :(得分:2)

正如您在对问题的评论中提到的那样,导致错误的是空行/行。

df['event'].value_counts()没有显示空行的原因是因为pandas.Series.value_count()采用了可选参数dropna=True;默认情况下,此参数忽略所有null / NaN / np.nan / None值。这是一个快速举例说明:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: df = pd.DataFrame(columns=['a'])

In [4]: df['a'] = ['so', 'map', 'map', 'lol', np.nan, 'so', 'so', 'so', 'lol', np.nan]

In [5]: df['a'].value_counts()
Out[5]: 
so     4
lol    2
map    2
dtype: int64

In [6]: df['a'].value_counts(dropna=False)
Out[6]: 
so     4
lol    2
map    2
NaN    2
dtype: int64

在第6行的输出中,您可以看到NaN作为另一个类出现,但默认情况下(输出到行5)它不存在。如果您将此可选参数作为False传入,则您可以提前在空行中选择。

我希望这是有道理的!