web-dev-qa-db-fra.com

Extraction de colonnes spécifiques sélectionnées dans le nouveau DataFrame en tant que copie

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?

119
SpeedCoder5

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)
232
johnchase

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
4
Hit

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)
3
Deslin Naidoo

Le plus simple est

new = old[['A','C','D']]

.

3
stidmatt

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)
0
Ellen