J'ai un pandas DataFrame avec 4 colonnes et je veux créer un nouveau DataFrame qui seul a trois des colonnes. Cette question est similaire à: Extraction de colonnes spécifiques d'un bloc de données mais pour pandas pas R. Le code suivant ne fonctionne pas, génère une erreur et n'est certainement pas la méthode pandasnique pour le faire.
import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new = pd.DataFrame(Zip(old.A, old.C, old.D)) # raises TypeError: data argument can't be an iterator
Quelle est la façon pandasnic de le faire?
Il existe un moyen de le faire et cela ressemble en réalité à R
new = old[['A', 'C', 'D']].copy()
Ici, vous sélectionnez simplement les colonnes que vous voulez dans le bloc de données d'origine et créez une variable pour celles-ci. Si vous souhaitez modifier le nouveau cadre de données, vous souhaiterez probablement utiliser .copy()
pour éviter une SettingWithCopyWarning
.
Une autre méthode consiste à utiliser filter
qui créera une copie par défaut:
new = old.filter(['A','B','D'], axis=1)
Enfin, en fonction du nombre de colonnes dans votre cadre de données d'origine, il pourrait être plus succinct de l'exprimer à l'aide de drop
(cela créera également une copie par défaut):
new = old.drop('B', axis=1)
Un autre moyen plus simple semble être:
new = pd.DataFrame ([old.A, old.B, old.C]). transpose ()
où old.column_name vous donnera une série. Dressez une liste de toutes les séries de colonnes que vous souhaitez conserver et transmettez-les au constructeur DataFrame. Nous devons faire une transposition pour ajuster la forme.
In [14]:pd.DataFrame([old.A,old.B,old.C]).transpose()
Out[14]:
A B C
0 4 10 100
1 5 20 50
Forme fonctionnelle générique
def select_columns(data_frame, column_names):
new_frame = data_frame.loc[:, column_names]
return new_frame
Spécifique pour votre problème ci-dessus
selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)
Le plus simple est
new = old[['A','C','D']]
.
Autant que je sache, il n'est pas nécessaire de spécifier l'axe lorsque vous utilisez la fonction de filtrage.
new = old.filter(['A','B','D'])
renvoie le même cadre de données que
new = old.filter(['A','B','D'], axis=1)