如何根据python中的特定条件拆分数据库?

how to split a database according to a specific condition in python?

我正在处理一个巨大的数据集,我必须将它分成两部分用于训练和测试过程。我知道有一个特定的函数 (sklearn.model_selection.train_test_split) 但是,由于数据库不平衡,我必须编写自己的函数。

我想做的是根据值1和0将数据集分成两部分,然后取每个部分的百分比(比如1的60%和0的30%)并保存到train中文件。其余行(40% 和 70%)应保存在测试文件中。

目前我是这样实现的

def split_test_train (df, train_0, train_1, test_0, test_1, name=['column_name']):
  dataframe_values_1 = df.loc[df[name]== 1] #all the rows with 1
  dataframe_values_0 = df.loc[df[name] == 0] #all the rows with 0

  data_train_zero= dataframe_values_0.iloc[:train_0, :]
  data_train_one= dataframe_values_1.iloc[:train_1, :]
  data_test_zero=dataframe_values_0.iloc[ -test_0:, :]
  data_test_one=dataframe_values_1.iloc[ -test_0:, :]

  data_train=pd.concat([data_train_zero,data_train_one])
  data_test=pd.concat([data_test_zero,data_test_one])
  ..
  ..
  return train, test

它工作正常,但我不想手动计算要作为参数传递的行的值,而是按百分比自动拆分它。

我正在开发 Google Colab。

您可以使用 pandas.DataFrame.sample 方法对给定百分比的数据进行采样:

import numpy as np
import pandas as pd

p_ones, p_zeros = 0.6, 0.3  # 60% and 30% from your question
df_ones = df[df['target_name'] == 1]  # data with labels 1
df_zeros = df[df['target_name'] == 0]  # data with labels 0
# 60% of data with labels 1
train_df_ones = df_ones.sample(int(len(df_ones) * p_ones))
# 30% of data with labels 0
train_df_zeros = df_zeros.sample(int(len(df_zeros) * p_zeros))
# Training data with 60% 1s and 30% 0s
train_df = pd.concat([train_df_ones, train_df_zeros], axis=0)
# Test data with 40% 1s and 70% 0s
test_df = df[~df.index.isin(train_df.index)]