按带有比率的标签拆分熊猫数据框

时间:2021-07-07 03:21:37

标签: python pandas

假设我有一个包含 100 个句子的数据框(50 个垃圾邮件,50 个不是垃圾邮件)
目标:我需要将它们分开用于训练:测试数据,比例为80:20
这将是80 个测试数据(40 个垃圾邮件 + 40 个非垃圾邮件)和 20 个测试数据(10 个垃圾邮件 + 10 个非垃圾邮件)

注意:我正在使用熊猫,我需要这些比率本身就是一个变量,以便我可以更改它

我在哪里:

import pandas as pd

df = pd.DataFrame({'sentence': {0: 'FU bro',
  1: 'Well thats kinda cool',
  2: 'Haha thats so funny',
  3: 'cant u make somethin else mtfk',
  4: 'what a shame'},
 'label': {0: 'spam', 1: 'not spam', 2: 'not spam', 3: 'spam', 4: 'spam'}})

spam = df.loc[df['label']=='spam']
not_spam = df.loc[df['label']=='not spam']

print(spam)
print(not_spam)
#print(df.loc[df['label']=='not spam'].sum)

这是我的数据帧的标题:

<头>
一句话 标签
福哥 垃圾邮件
那还挺酷的 不是垃圾邮件
哈哈好笑 不是垃圾邮件
你不能做别的东西吗mtfk 垃圾邮件
可惜了 垃圾邮件

2 个答案:

答案 0 :(得分:2)

您可以使用 DataFrame.sample()

training_data_ratio = 0.8
train_spam = spam.sample(frac=training_data_ratio, random_state=0)
test_spam = spam.drop(train_spam.index)

对于非垃圾邮件数据也类似。


另外,如果您需要检查有多少条目是垃圾邮件和非垃圾邮件,可以使用value_counts

>>> df.label.value_counts()
spam        3
not spam    2
Name: label, dtype: int64

答案 1 :(得分:1)

试试这个:

train = df.groupby('label').sample(frac=.8)
test = df.loc[df.index.difference(train.index)]