web-dev-qa-db-fra.com

Qu'est-ce que cela signifie? Erreur Xarray: Impossible de gérer un multi-index non unique

J'essaie de convertir un Dataframe à Xarray. La tête est comme ceci:

z   Class    DA       x          y          iline      xline      idz                                                      
2     651   289  1455.0        2.0        0.62239  2345322.0  76720.0
            290  1460.0        0.0        0.46037  2345322.0  76720.0
            291  1465.0        4.0        0.41280  2345322.0  76720.0
            292  1470.0        0.0        0.39540  2345322.0  76720.0
            293  1475.0        2.0        0.61809  2345322.0  76720.0

quand j'utilise xr.DataSet.from_dataframe, ou df.to_xarray, J'ai eu le message d'erreur suivant:

cannot handle a non-unique multi-index!

Quelqu'un sait ce qui se passe ici?

4
Y. Peng

L'index multi-index de votre cadre de données contient des entrées en double, que Xarray ne peut pas inscrire à une matrice multidimensionnelle - les éléments des matrices hypothétiques n'auraient pas une valeur unique.

Vous devez enlever les entrées dupliquées dans l'index d'abord, par exemple, comme décrit dans supprimer des lignes avec des indices en double (Pandas Dataframe et ELYERIES) :=:

  • Le choix le plus simple serait de supprimer des duplicats, par exemple, df[~df.index.duplicated()]
  • Vous pouvez également utiliser une opération de groupeBy, par exemple, pour calculer la moyenne: df.gropuby(level=df.index.names).mean()

Une fois que vous avez fait cela, vous pouvez convertir en toute sécurité le Dataframe en Xarray.

3
shoyer

Lorsque vous convertissez CSV en NetCDF via to_xarray, Il est important que l'arrangement des têtes est égal à l'arrangement de votre morue, sinon vous obtenez le error: cannot handle a non-unique multi-index.

0
HMadadi

Dans ce cas df.columns.is_unique Retournerait False. Pour identifier lequel on se répète, vous pouvez voir la fréquence de chaque paire de colonnes par df.columns.value_counts(). Pour le fonctionnement multididexing, il devrait indiquer 1 Pour tous les tuples.