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?

SpeedCoder5
źródło

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)
johnchase
źródło
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
19

Najłatwiej jest

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

.

stidmatt
źródło
3
To nie jest tworzenie kopii, chyba że jawnie wywołasz .copy ()
Sylvain
to kopiuje domyślnie.
Nguai al
2
@Nguaial nie określono zachowania prostego indeksowania. Nie będziesz wiedział, czy dostaniesz kopię czy widok. Więcej szczegółów w dokumentacji: pandas.pydata.org/pandas-docs/stable/user_guide/ ...
Ole Fass
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
Trafienie
źródło
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)
Deslin Naidoo
źródło
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']]
Kłamstwo
źródło
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)
Ellen
źródło
1

kolumny według indeksu:

# selected column index: 1, 6, 7
new = old.iloc[: , [1, 6, 7]].copy() 
żaglica009
źródło