2013-06-23 9 views
5

Ich mache eine Maschine lernen Berechnungen mit zwei Datenrahmen - eine für Faktoren und andere für die Zielwerte. Ich muss beides in Training und Test teilen. Es scheint mir, dass ich den Weg gefunden habe, aber ich suche eine elegantere Lösung. Hier ist mein Code:Sample zwei Pandas Datenrahmen auf die gleiche Weise

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) 

---- bearbeitet - Lösung von unutbu (midifizierte) ---

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] 

Antwort

6

Wenn Sie rows ein boolean Array der Länge machen len(df), dann können Sie die bekommen True Reihen mit df[rows] und nutzen Sie die False Reihen mit df[~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 
+0

thanx! Weil ich etwas Perzentil verwenden muss, habe ich die Zeile mit rows = ... geändert. –

+0

In diesem Fall könnten Sie 'rows = np.random.binomial (1, Perzentil * 100, size = len (df_source)) verwenden. '. – unutbu

+0

ja, es funktioniert, danke –

Verwandte Themen