Extrahieren bestimmter ausgewählter Spalten in einen neuen DataFrame als Kopie

180

Ich habe einen Pandas-DataFrame mit 4 Spalten und möchte einen neuen DataFrame erstellen , der nur drei Spalten enthält. Diese Frage ähnelt: Extrahieren bestimmter Spalten aus einem Datenrahmen, jedoch für Pandas nicht R. Der folgende Code funktioniert nicht, löst einen Fehler aus und ist sicherlich nicht die pandasnische Methode, dies zu tun.

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 

Was ist der pandasnische Weg, um es zu tun?

SpeedCoder5
quelle

Antworten:

351

Es gibt eine Möglichkeit, dies zu tun, und es sieht tatsächlich ähnlich wie R aus

new = old[['A', 'C', 'D']].copy()

Hier wählen Sie einfach die gewünschten Spalten aus dem ursprünglichen Datenrahmen aus und erstellen eine Variable für diese. Wenn Sie den neuen Datenrahmen überhaupt ändern möchten, möchten Sie ihn wahrscheinlich verwenden .copy(), um a zu vermeiden SettingWithCopyWarning.

Es wird eine alternative Methode verwendet filter, mit der standardmäßig eine Kopie erstellt wird:

new = old.filter(['A','B','D'], axis=1)

Abhängig von der Anzahl der Spalten in Ihrem ursprünglichen Datenrahmen ist es möglicherweise prägnanter, dies mit a auszudrücken drop(dies erstellt standardmäßig auch eine Kopie):

new = old.drop('B', axis=1)
Johnchase
quelle
18
Vorsicht beim Kopieren nur einer Spalte: In old[['A']].copy()werden die doppelten eckigen Klammern benötigt, um einen neuen Datenrahmen zu erstellen. Beachten Sie, dass old['A'].copy()nur eine Serie erstellt wird.
Intecho
19

Der einfachste Weg ist

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

.

stidmatt
quelle
3
Dies macht keine Kopie, es sei denn, Sie rufen ausdrücklich .copy ()
Sylvain
Dies kopiert standardmäßig.
Nguai al
1
@Nguaial Das Verhalten der einfachen Indizierung ist nicht angegeben. Sie werden nicht wissen, ob Sie eine Kopie oder eine Ansicht erhalten. Weitere Informationen finden Sie in der Dokumentation: pandas.pydata.org/pandas-docs/stable/user_guide/…
Ole Fass,
8

Ein anderer einfacherer Weg scheint zu sein:

new = pd.DataFrame([old.A, old.B, old.C]).transpose()

wo old.column_namewird dir eine serie geben. Erstellen Sie eine Liste aller Spaltenreihen, die Sie beibehalten möchten, und übergeben Sie sie an den DataFrame-Konstruktor. Wir müssen eine Transponierung durchführen, um die Form anzupassen.

In [14]:pd.DataFrame([old.A, old.B, old.C]).transpose()
Out[14]: 
   A   B    C
0  4  10  100
1  5  20   50
Schlagen
quelle
funktioniert, aber nicht, wenn Spaltenname Sonderzeichen enthält.
Jimh
Oh, daran hatte ich nicht gedacht
Hit
3

Generische Funktionsform

def select_columns(data_frame, column_names):
    new_frame = data_frame.loc[:, column_names]
    return new_frame

Speziell für Ihr Problem oben

selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)
Deslin Naidoo
quelle
2

Wenn Sie einen neuen Datenrahmen haben möchten, dann:

import pandas as pd
old = pd.DataFrame({'A' : [4,5], 'B' : [10,20], 'C' : [100,50], 'D' : [-30,-50]})
new=  old[['A', 'C', 'D']]
Eine Lüge
quelle
1

Soweit ich das beurteilen kann, müssen Sie bei Verwendung der Filterfunktion nicht unbedingt die Achse angeben.

new = old.filter(['A','B','D'])

gibt den gleichen Datenrahmen zurück wie

new = old.filter(['A','B','D'], axis=1)
Ellen
quelle
1

Spalten nach Index:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 
Segelfisch009
quelle