3 votes

Pandas shuffle column values ne fonctionne pas

J'ai un csv avec 2 colonnes : "Contexte", "Utterance".

J'ai besoin de mélanger (dans un ordre aléatoire) les valeurs de la colonne "Contexte". Notez que ce n'est pas toute la ligne qui doit être mélangée, mais seulement une colonne, l'ordre de la deuxième colonne "Utterance" reste le même.

Pour cela, j'ai utilisé : les réponses ( brassage/permutation d'un DataFrame dans pandas )

  train_df2 = pd.read_csv("./data/nolabel.csv", encoding='utf-8', sep=",")
  train_df2.drop('Utterance', axis=1, inplace=True) # delete 'Utterance'
  train_df2 = train_df2.sample(frac=1) # shuffle
  train_df2['Utterance'] = train_moscow_df['Utterance'] # add back 'Utterance'
  train_df2["Label"] = 0 
  header = ["Context", "Utterance", "Label"] # 

  train_df2.to_csv('./data/label0.csv', columns = header, encoding='utf-8', index = False)

MAIS, le résultat est mauvais : j'ai obtenu un brassage complet des lignes, mais les valeurs correspondantes de 2 colonnes sont toujours les mêmes.

J'ai besoin que la première valeur de la première colonne corresponde à une valeur aléatoire de la deuxième colonne (j'ai aussi essayé). from sklearn.utils import shuffle mais pas de chance non plus)

4voto

EdChum Points 10205

Le problème est que lorsque le df est mélangé, l'index est mélangé mais ensuite vous ajoutez la colonne originale et elle s'alignera sur l'index original, vous pouvez appeler reset_index pour qu'il ne fasse pas ça :

train_df2 = train_df2.sample(frac=1) # shuffle
train_df2.reset_index(inplace=True, drop=True)
train_df2['Utterance'] = train_moscow_df['Utterance'] # add back 'Utterance'

Exemple :

In [196]:
# setup
df = pd.DataFrame(np.random.randn(5,2), columns=list('ab'))
df

Out[196]:
          a         b
0  0.116596 -0.684748
1 -0.133922 -0.969933
2  0.103551  0.912101
3 -0.279751 -0.348443
4  1.453413  0.062378

maintenant, nous laissons tomber et mélangeons comme avant, notez les valeurs d'indice

In [197]:
a = df.drop('b', axis=1)
a = a.sample(frac=1)
a

Out[197]:
          a
3 -0.279751
0  0.116596
1 -0.133922
4  1.453413
2  0.103551

maintenant réinitialisé

In [198]:    
a.reset_index(inplace=True, drop=True)
a

Out[198]:
          a
0 -0.279751
1  0.116596
2 -0.133922
3  1.453413
4  0.103551

nous pouvons rajouter la colonne mais conserver l'ordre mélangé :

In [199]:
a['b'] = df['b']
a

Out[199]:
          a         b
0 -0.279751 -0.684748
1  0.116596 -0.969933
2 -0.133922  0.912101
3  1.453413 -0.348443
4  0.103551  0.062378

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X