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?

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)

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


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

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)

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']]

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)

1

Spalten nach Index:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.