Vérifier si data frame est une copie ou une vue dans Pandas

y a-t-il un moyen facile de vérifier si deux cadres de données sont des copies ou des vues différentes des mêmes données sous-jacentes qui n'impliquent pas de manipulations? J'essaie d'avoir une emprise sur, lorsque chacun est généré, et étant donné la façon idiosyncrasique les règles semblent être, j'aimerais un moyen simple pour tester.

par exemple, je pensais " id (DF.valeurs) "seraient stables d'un point de vue à l'autre, mais elles ne semblent pas l'être:

# Make two data frames that are views of same data.
df = pd.DataFrame([[1,2,3,4],[5,6,7,8]], index = ['row1','row2'], 
       columns = ['a','b','c','d'])
df2 = df.iloc[0:2,:]

# Demonstrate they are views:
df.iloc[0,0] = 99
df2.iloc[0,0]
Out[70]: 99

# Now try and compare the id on values attribute
# Different despite being views! 

id(df.values)
Out[71]: 4753564496

id(df2.values)
Out[72]: 4753603728

# And we can of course compare df and df2
df is df2
Out[73]: False

autres réponses j'ai cherché qui essayent pour donner des règles, mais ne semblent pas cohérentes, et ne répondent pas non plus à cette question de savoir comment tester:

  • quelles règles Pandas utilise-t-il pour générer une vue par rapport à une copie?

  • Pandas: Subindexing dataframes: Copies vs views

  • la Compréhension des pandas dataframe indexation

  • Re-affectation dans les Pandas: la Copie ou l'afficher?

et bien sûr: - http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy

mise à jour: les commentaires ci-dessous semblent répondre à la question -- en regardant l'attribut df.values.base plutôt que df.values l'attribut le fait, comme le fait une référence à l'attribut df._is_copy (bien que ce dernier soit probablement de très mauvaise forme puisqu'il s'agit d'un interne).

22
demandé sur Brad Solomon 2014-11-12 07:05:05

2 réponses

réponses de HYRY et Marius dans les commentaires!

on peut vérifier par:

  • les tests d'équivalence de la "151900920 attribut" plutôt que le values attribut, comme dans:

    df.values.base is df2.values.base au lieu de df.values is df2.values .

  • ou en utilisant l'attribut (certes interne) _is_view ( df2._is_view est True ).

merci à tous!

13
répondu nick_eu 2017-01-18 20:37:32

vous pourriez tracer la mémoire que votre environnement pandas/python consomme, et, en supposant qu'une copie utilisera plus de mémoire qu'une vue, être capable de décider d'une manière ou d'une autre.

je crois qu'il y a des bibliothèques qui présentent l'utilisation de la mémoire dans l'environnement python lui - même-par exemple Heapy/Guppy.

il devrait y avoir une métrique que vous pouvez appliquer qui prend une image de base de l'utilisation de la mémoire avant de créer le l'objet de l'inspection, puis une autre image par la suite. La comparaison des deux cartes mémoire (en supposant que rien d'autre n'a été créé et que nous pouvons isoler le changement est dû au nouvel objet) devrait fournir une idée de si une vue ou une copie a été produite.

il faudrait se faire une idée des différents profils de mémoire de chaque type d'implémentation, mais certaines expérimentations devraient donner des résultats.

0
répondu Thomas Kimber 2014-11-12 16:51:31