Je voudrais créer des vues ou des cadres de données à partir d'un cadre de données existant en fonction de la sélection des colonnes.
Par exemple, je voudrais créer un dataframe df2
à partir d'un dataframe df1
qui contient toutes les colonnes de ce dernier sauf deux d'entre elles. J'ai essayé de faire ce qui suit, mais cela n'a pas fonctionné :
import numpy as np
import pandas as pd
# Create a dataframe with columns A,B,C and D
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
# Try to create a second dataframe df2 from df with all columns except 'B' and D
my_cols = set(df.columns)
my_cols.remove('B').remove('D')
# This returns an error ("unhashable type: set")
df2 = df[my_cols]
Qu'est-ce que je fais de mal ? Plus généralement, quels sont les mécanismes dont dispose pandas pour prendre en charge la sélection et l'exclusion d'ensembles arbitraires de colonnes d'un cadre de données ?
Vous devez juste convertir votre set
en list
.
import pandas as pd
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
my_cols = set(df.columns)
my_cols.remove('B')
my_cols.remove('D')
my_cols = list(my_cols)
df2 = df[my_cols]
Voici comment créer une copie d'un DataFrame
en excluant une liste de colonnes :
df = pd.DataFrame(np.random.randn(100, 4), columns=list('ABCD'))
df2 = df.drop(['B', 'D'], axis=1)
Mais attention ! Vous mentionnez les vues dans votre question, suggérant que si vous modifiez df
, vous voudriez que df2
change aussi. (Comme le ferait une vue dans une base de données).
Cette méthode ne permet pas d'atteindre cet objectif :
>>> df.loc[0, 'A'] = 999 # Change the first value in df
>>> df.head(1)
A B C D
0 999 -0.742688 -1.980673 -0.920133
>>> df2.head(1) # df2 is unchanged. It's not a view, it's a copy!
A C
0 0.251262 -1.980673
Notez que ceci est également vrai de la méthode de @piggybox's. (Bien que cette méthode soit belle, lisse et pythique. Je ne le ferai pas !)
Pour en savoir plus sur les vues et les copies, consultez [cette réponse de l'OS] (https://stackoverflow.com/a/17961468/2071807) et [cette partie de la documentation de Pandas] (http://pandas.pydata.org/pandas-docs/dev/indexing.html#returning-a-view-versus-a-copy) à laquelle cette réponse fait référence.