Pandas: 在不使用循环的情况下获取数据子集

我想根据customer_id(数据框中的多行可能有相同的customer_id)将训练数据拆分为训练/测试集,我在想是否有更符合Pandas原生方式的方法来完成build df_testdrop from df_train部分,而不使用循环?

# 将数据拆分为训练/测试集
df_train = pd.read_csv('data/train.csv')
print('df_train.shape', df_train.shape)
df_train = df_train.replace(np.nan, 'nan', regex=True)
train_customer_id_set = df_train.customer_id.unique()
print('len(train_customer_id_set)', len(train_customer_id_set))

# 按customer_id将训练数据拆分为训练/测试
n = 1000
test_customer_id_set = list(train_customer_id_set)
random.shuffle(test_customer_id_set)
test_customer_id_set = test_customer_id_set[:n]

# 问题:如何在不使用循环的情况下完成?
# 构建df_test
df_list = []
for customer_id in test_customer_id_set:
    df = df_train[df_train['customer_id']==customer_id]
    df_list.append(df)
df_test = pd.concat(df_list)

# 从df_train中删除
for customer_id in test_customer_id_set:
    df_train = df_train.drop(df_train[df_train.customer_id==customer_id].index)

train_customer_id_set = df_train.customer_id.unique()
print('df_train.shape', df_train.shape)
print('df_test.shape', df_test.shape)

回答:

在计算test_customer_id_set之后,你所做的事情似乎等同于:

df_test = df_train[df_train.customer_id.isin(test_customer_id_set)]
df_train = df_train[~df_train.customer_id.isin(test_customer_id_set)]

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注