web-dev-qa-db-fra.com

Pandas: Échantillonnage d'un DataFrame

J'essaie de lire un fichier CSV assez volumineux avec Pandas) et de le scinder en deux morceaux aléatoires, l'un représentant 10% des données et l'autre 90%.

Voici ma tentative actuelle:

rows = data.index
row_count = len(rows)
random.shuffle(list(rows))

data.reindex(rows)

training_data = data[row_count // 10:]
testing_data = data[:row_count // 10]

Pour une raison quelconque, sklearn lève cette erreur lorsque j'essaie d'utiliser l'un de ces objets DataFrame obtenus à l'intérieur d'un classificateur SVM:

IndexError: each subindex must be either a slice, an integer, Ellipsis, or newaxis

Je pense que je le fais mal. Y a-t-il une meilleure manière de faire cela?

68
Blender

Quelle version de pandas utilisez-vous? Pour moi, votre code fonctionne bien (je suis sur git master).

Une autre approche pourrait être:

In [117]: import pandas

In [118]: import random

In [119]: df = pandas.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))

In [120]: rows = random.sample(df.index, 10)

In [121]: df_10 = df.ix[rows]

In [122]: df_90 = df.drop(rows)

La version la plus récente (à partir de la version 0.16.1) supporte directement ceci: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sample.html

80
Wouter Overmeire

J'ai trouvé que np.random.choice() new dans NumPy 1.7.0 fonctionne assez bien pour cela.

Par exemple, vous pouvez transmettre les valeurs d'index d'un DataFrame et le nombre entier 10 pour sélectionner 10 lignes échantillonnées de manière aléatoire.

rows = np.random.choice(df.index.values, 10)
sampled_df = df.ix[rows]
79
dragoljub

Nouveau dans la version 0.16.1:

sample_dataframe = your_dataframe.sample(n=how_many_rows_you_want)

doc ici: http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.sample.html

24
dval

Les pandas 0.16.1 ont une méthode échantillon pour cela.

14
hurrial

Si vous utilisez pandas.read_csv, vous pouvez directement échantillonner lors du chargement des données, en utilisant le paramètre skiprows. Voici un court article que j'ai écrit à ce sujet - https://nikolaygrozev.wordpress.com/2015/06/16/fast-and-simple-sampling-in-pandas-when-loading-data- à partir de fichiers /

6
Nikolay