Wyodrębnianie określonych wybranych kolumn do nowej ramki DataFrame jako kopii


185

Mam pandy DataFrame z 4 kolumnami i chcę utworzyć nową ramkę DataFrame, która ma tylko trzy kolumny. To pytanie jest podobne do: Wyodrębnianie określonych kolumn z ramki danych, ale dla pand nie R. Poniższy kod nie działa, powoduje błąd iz pewnością nie jest to pandasowy sposób.

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 

Jaki jest pandasnicki sposób na zrobienie tego?

Odpowiedzi:


359

Jest na to sposób i faktycznie wygląda podobnie do R.

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

Tutaj po prostu wybierasz żądane kolumny z oryginalnej ramki danych i tworzysz dla nich zmienną. Jeśli chcesz w ogóle zmodyfikować nową ramkę danych, prawdopodobnie będziesz chciał użyć, .copy()aby uniknąć SettingWithCopyWarning.

Alternatywną metodą jest użycie, filterktóra domyślnie utworzy kopię:

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

Wreszcie, w zależności od liczby kolumn w oryginalnej ramce danych, bardziej zwięzłe może być wyrażenie tego za pomocą drop(spowoduje to również utworzenie kopii domyślnie):

new = old.drop('B', axis=1)

20
Uwaga przy kopiowaniu tylko jednej kolumny: w old[['A']].copy()programie do utworzenia nowej ramki danych wymagane są podwójne nawiasy kwadratowe. Pamiętaj, że old['A'].copy()stworzy to tylko Serię.
intotecho


8

Wydaje się, że inny prostszy sposób:

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

gdzie old.column_nameda ci serię. Utwórz listę wszystkich serii kolumn, które chcesz zachować, i przekaż ją do konstruktora DataFrame. Musimy dokonać transpozycji, aby dostosować kształt.

In [14]:pd.DataFrame([old.A, old.B, old.C]).transpose()
Out[14]: 
   A   B    C
0  4  10  100
1  5  20   50

działa, ale nie, jeśli nazwa_kolumny zawiera znaki specjalne.
jimh

och, nie pomyślałem o tym
Hit

3

Ogólna forma funkcjonalna

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

Specyficzne dla twojego problemu powyżej

selected_columns = ['A', 'C', 'D']
new = select_columns(old, selected_columns)

2

Jeśli chcesz mieć nową ramkę danych, to:

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

O ile wiem, nie musisz koniecznie określać osi podczas korzystania z funkcji filtru.

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

zwraca tę samą ramkę danych co

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

1

kolumny według indeksu:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.