J'ai un fichier CSV désespéré avec des valeurs de temps et de x et y que je veux résoudre, comme celui ci-dessous: je veux tous les valeurs X et Y de droite Dans une colonne, analogue à la sélection de cellules vides dans Excel, en supprimant et à déplacer les cellules laissées, comme: p> Je voudrais automatiser ce processus plutôt que de le faire sur Excel Étant donné que ce fichier couvre une centaine de colonnes et des milliers de lignes. P> Voici les défis que j'ai eu jusqu'à présent: p> Il existe des valeurs de NaN que je ne veux pas supprimer (telles que la 5ème rangée, le temps = 4) et la plupart des autres lignes contiennent également des NANs. Donc, vous supprimez simplement les valeurs de la NAAN avec Toute aide ou conseil serait formidable. p> p>
df.dropna () code> n'a pas fonctionné (il a également supprimé les valeurs que je voulais conserver) p> li>
df.shift () code> supprime également les valeurs que je veux conserver, il n'est donc pas possible de laisser simplement tomber une ligne ou une colonne n'est pas possible. P> LI>
ol>
3 Réponses :
J'essaie de créer une solution générale avec plusieurs paires non nannes par rangées pour convertir des lignes séparées dans les lignes distinctes de 2 colonnes Dataframe: idée est du deuxième niveau de mais toutes seules les lignes NANES sont supprimées, d'abord obtenir cette valeurs d'index par et utilisez multididex code > par Multidex.get_Level_Values Code> , remplacer les valeurs code> sans numéro après la chaîne et utilisez série.str.extrait code> pour 2 colonne dataframe code> transmis à multididex.from_arrays code> , donc Remodeler possible par Dataframe.stack : p> index.difefence code> , passe à Dataframe code> constructeur: p > dataframe.append code> avec dataframe.sort_index code> pour les ajouter à l'original, car reindex code> ne fonctionne pas avec des valeurs DUPLICATES: P> df3 = df1.append(df2, sort=True).sort_index()
print (df3)
X Y
1 724.0 82.0
1 NaN 4.0
2 717.0 83.0
3 683.0 81.0
4 NaN NaN
5 718.0 78.0
6 710.0 79.0
7 705.0 83.0
8 706.0 86.0
9 705.0 86.0
10 705.0 86.0
Existe-t-il un moyen de définir automatiquement les niveaux du multididex? Parce qu'il y a 255 colonnes dans le fichier réel.
@Erico - Qu'est-ce que impression (df.columns) code>? Parce que si pas multididex a peut-être besoin de df = pd.read_csv (fichier, en-tête = [0,1]) code>
Vous pouvez le faire de cette façon:
Merci. J'ai essayé cette méthode, mais j'ai eu cette erreur: assertionError: 2 colonnes passées, les données transmises ont eu 225 colonnes code> n'importe quelle idée d'où cela vient?
J'ai donc travaillé sur cela un peu plus: en consultant la liste "Données", il ne répertorie correctement que les valeurs x et y. Toutefois, lors de la création du nouveau Dataframe, AssertionError: 2 colonnes passées, les données transmises ont eu 225 colonnes code> apparaissent. Après avoir ajouté des colonnes supplémentaires à la correspondance des données transmises, de manière intéressante, les colonnes supplémentaires avaient «Nan» ou «None». Tout ce que j'ai fait après c'était laisser tomber ces colonnes supplémentaires à l'aide de df.drop () code> de toute façon, votre première ligne de code semble fonctionner, même si vous avez des modifications. Merci
index de fantaisie: P> set_index code> colonne heure code>. Utilisation de numpy argmax code> pour rechercher la 1ère position de non- nan code> de chaque ligne. Construire 2D Array n code> à partir du résultat A code> de argmax code>. Utilisation d'un index FANCE pour générer une matrice 2D de non- NaN code> à partir de df.values code> et utilisez-le pour créer un nouveau Dataframe pd.DataFrame(df.values[np.arange(len(df))[:,None], n], columns=['X', 'Y'])
Out[452]:
X Y
0 724.0 82.0
1 717.0 83.0
2 683.0 81.0
3 NaN NaN
4 718.0 78.0
5 710.0 79.0
6 705.0 83.0
7 706.0 86.0
8 705.0 86.0
9 705.0 86.0
J'ai donné à la vôtre une photo, mais pour une raison quelconque, le Dataframe résultant était vide, plus l'index de fantaisie n'a pas modifié la trame de données de toute façon. J'ai découvert que certaines de mes valeurs NA étaient des chaînes vides (qui affecteraient df.isna () code>) mais lors de la lecture des données CSV, j'ai spécifié la chaîne vide comme valeur NA. Tout ce que je devrais diagnostiquer?
Vous pouvez utiliser
FILLNA code>. Mais comme je ne peux pas deviner quels sont les noms de colonne de votre Dataframe actuel, ni si le temps est une vraie colonne ou un index, je ne peux pas vous donner de code.`df.fillna () 'ne remplacera que les NANs avec la méthode que vous choisissez de remplir avec. Ce que je veux faire, c'est supprimer les NANs inutiles et déplacer toutes les valeurs valides en une colonne "x" et "y".
Comme je l'ai dit dans mon commentaire précédent, je peux proposer un code pour remplir les 2 premières colonnes et effacer les autres, à condition que je puisse construire quelque chose i> avec la structure de votre Dataframe d'origine. Ce que je ne peux pas parce que j'ai besoin de connaissance des noms de colonne et des indices.