12

我正在做一个机器学习计算,它有两个数据框——一个用于因子,另一个用于目标值。我必须分成训练和测试部分。在我看来,我已经找到了方法,但我正在寻找更优雅的解决方案。这是我的代码:

import pandas as pd
import numpy as np
import random

df_source = pd.DataFrame(np.random.randn(5,2),index = range(0,10,2), columns=list('AB'))
df_target = pd.DataFrame(np.random.randn(5,2),index = range(0,10,2), columns=list('CD'))

rows = np.asarray(random.sample(range(0, len(df_source)), 2))

df_source_train = df_source.iloc[rows]
df_source_test = df_source[~df_source.index.isin(df_source_train.index)]
df_target_train = df_target.iloc[rows]
df_target_test = df_target[~df_target.index.isin(df_target_train.index)]

print('rows')
print(rows)
print('source')
print(df_source)
print('source train')
print(df_source_train)
print('source_test')
print(df_source_test)

---- 编辑 - unutbu 的解决方案 (midified) ---

np.random.seed(2013)
percentile = .6
rows = np.random.binomial(1, percentile, size=len(df_source)).astype(bool)

df_source_train = df_source[rows]
df_source_test = df_source[~rows]
df_target_train = df_target[rows]
df_target_test = df_target[~rows]
4

5 回答 5

10

如果您创建rows一个长度为的布尔数组len(df),那么您可以使用 获取Truedf[rows]并使用 获取Falsedf[~rows]

import pandas as pd
import numpy as np
import random
np.random.seed(2013)

df_source = pd.DataFrame(
    np.random.randn(5, 2), index=range(0, 10, 2), columns=list('AB'))

rows = np.random.randint(2, size=len(df_source)).astype('bool')

df_source_train = df_source[rows]
df_source_test = df_source[~rows]

print(rows)
# [ True  True False  True False]

# if for some reason you need the index values of where `rows` is True
print(np.where(rows))  
# (array([0, 1, 3]),)

print(df_source)
#           A         B
# 0  0.279545  0.107474
# 2  0.651458 -1.516999
# 4 -1.320541  0.679631
# 6  0.833612  0.492572
# 8  1.555721  1.741279

print(df_source_train)
#           A         B
# 0  0.279545  0.107474
# 2  0.651458 -1.516999
# 6  0.833612  0.492572

print(df_source_test)
#           A         B
# 4 -1.320541  0.679631
# 8  1.555721  1.741279
于 2013-06-23T11:51:35.773 回答
10

您可以在下面找到我的解决方案,它不涉及任何额外的变量。

  1. 使用.sample方法获取数据样本
  2. 对样本使用.index方法,获取索引
  3. 按索引申请slice()第二次dataframe

例如,假设您有 X 和 Y,并且您想在每个样本上获得 10 个样本。当然,它应该是相同的样本

X_sample = X.sample(10)
y_sample = y[X_sample.index]
于 2019-02-17T08:15:43.343 回答
3

我喜欢 Alexander 的回答,但我会在采样之前添加一个索引重置。完整代码:

# index reset
X.reset_index(inplace=True, drop=True)
y.reset_index(inplace=True, drop=True)
# sampling
X_sample = X.sample(10)
y_sample = y[X_sample.index]

索引的重置用于匹配没有问题。

于 2020-09-16T08:03:14.333 回答
0

我认为一个更简单的解决方案是:

from sklearn.model_selection import train_test_split

df_source_train, df_source_test, df_target_train, df_target_test = train_test_split(df_source, df_target, train_size=.6)
于 2021-02-13T02:47:22.377 回答
0

我喜欢 Alexander 和 pplonski 的回答。只想补充一点,访问索引可能需要 iloc 如下:

y_sample = y.iloc[X_sample.index]
于 2022-01-12T20:16:32.337 回答