以相同的方式对两个pandas数据帧进行采样

时间:2013-06-23 11:03:22

标签: python pandas

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

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 个答案:

答案 0 :(得分:8)

如果您将rows设为长度为len(df)的布尔数组,则可以使用True获取df[rows]行并使用{获取False行{1}}:

df[~rows]

答案 1 :(得分:0)

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

  1. 使用.sample方法获取数据样本
  2. 在样本上使用.index方法以获取索引
  3. 第二次按slice()的索引dataframe应用

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

X_sample = X.sample(10)
y_sample = y[X_sample.index]

答案 2 :(得分:0)

我喜欢亚历山大(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]

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

答案 3 :(得分:0)

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

TCWindPDF.py