Jak dodać pustą kolumnę do ramki danych?


260

Jaki jest najłatwiejszy sposób dodania pustej kolumny do DataFrameobiektu pandy ? Najlepsze, na co się natknąłem, to coś w rodzaju

df['foo'] = df.apply(lambda _: '', axis=1)

Czy istnieje mniej perwersyjna metoda?


2
Czy rzeczywiście chcesz kolumnę zawierającą puste ciągi, czy raczej N/A?
filmowiec

Odpowiedzi:


419

Jeśli dobrze rozumiem, zadanie powinno wypełnić:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
>>> df
   A  B
0  1  2
1  2  3
2  3  4
>>> df["C"] = ""
>>> df["D"] = np.nan
>>> df
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

2
Ta odpowiedź właśnie stworzyła dla mnie nowe wiersze.
logicbloke

@logicbloke, czy możesz podać przykład, w którym to się dzieje?
craymichael

@craymichael Minęło trochę czasu, ale wydaje mi się, że miałem kolumny indeksowane liczbami bez nazw i nazwanych wierszy, a na końcu utworzyłem nowy wiersz.
logicbloke,

1
Jeśli dfjest pusty, możesz użyć df['new'] = pd.Series() (patrz moja odpowiedź poniżej)
Carsten

jak dodać wiele pustych kolumn?
M. Mariscal

46

Aby dodać do odpowiedzi DSM i bazując na tym powiązanym pytaniu , podzieliłem podejście na dwa przypadki:

  • Dodawanie pojedynczej kolumny: Po prostu przypisz puste wartości do nowych kolumn, np df['C'] = np.nan

  • Dodawanie wielu kolumn: Sugeruję użycie .reindex(columns=[...]) metody pand, aby dodać nowe kolumny do indeksu kolumn ramki danych. Działa to również w przypadku dodawania wielu nowych wierszy za pomocą .reindex(rows=[...]). Zauważ, że nowsze wersje Pand (v> 0.20) pozwalają na określenie axissłowa kluczowego zamiast jawnego przypisywania do columnslub rows.

Oto przykład dodawania wielu kolumn:

mydf = mydf.reindex(columns = mydf.columns.tolist() + ['newcol1','newcol2'])

lub

mydf = mydf.reindex(mydf.columns.tolist() + ['newcol1','newcol2'], axis=1)  # version > 0.20.0

Zawsze możesz też połączyć nową (pustą) ramkę danych z istniejącą ramką danych, ale nie wydaje mi się to pytoniczne :)


3
Przykład version >= 0.20.0usunięcia DataFrame i dodanie nowych kolumn jako wierszy. Przykład version < 0.20.0dobrze działa na wersji Pandas0.24.1
Lalo

@ emunsing Szukając odpowiedzi na to pytanie, ostatecznie uznałem twoją odpowiedź za pomocną. Początkowo jednak, że jest ono nie działa na mnie jak Pandy wymaga , axis=1się version = 0.25. Próbowałem zmodyfikować twoją odpowiedź, aby uwzględnić zaktualizowaną wersję, ale zostałem odrzucony przez @kenlukas i @il_raffa. Mam nadzieję, że wszyscy starają się zrozumieć, dlaczego twoja odpowiedź nie działa na nich - tak jak ja - przynajmniej napotyka ten komentarz.
Griff

@Griff - Zaktualizowałem moją odpowiedź, aby była bardziej dokładna i jednoznaczna na temat problemów ze zgodnością wersji. Dziękujemy za podkreślenie tego.
emuning

35

jeszcze prostszym rozwiązaniem jest:

df = df.reindex(columns = header_list)                

gdzie „lista_nagłówków” to lista nagłówków, które chcesz wyświetlić.

każdy nagłówek zawarty na liście, który nie znajduje się już w ramce danych, zostanie dodany z pustymi komórkami poniżej.

więc jeśli

header_list = ['a','b','c', 'd']

następnie c i d zostaną dodane jako kolumny z pustymi komórkami


2
Dokładniej, kolumny zostaną dodane za pomocą NaN.
brokuły 2000

19

Zaczynając od v0.16.0, DF.assign()można użyć do przypisania nowych kolumn ( pojedynczych / wielokrotnych ) do DF. Te kolumny są wstawiane w kolejności alfabetycznej na końcu DF.

Staje się to korzystne w porównaniu z prostym przypisywaniem w przypadkach, w których chcesz wykonać szereg powiązanych operacji bezpośrednio na zwróconej ramce danych.

Rozważ tę samą DFpróbkę zademonstrowaną przez @DSM:

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4]})
df
Out[18]:
   A  B
0  1  2
1  2  3
2  3  4

df.assign(C="",D=np.nan)
Out[21]:
   A  B C   D
0  1  2   NaN
1  2  3   NaN
2  3  4   NaN

Zauważ, że to zwraca kopię wszystkich poprzednich kolumn wraz z nowo utworzonymi. Aby DFodpowiednio zmodyfikować oryginał, użyj go w następujący sposób: df = df.assign(...)ponieważ nie obsługuje on inplaceobecnie operacji.


Jaki jest ten typ danych dla C? Próbuję dodać, przeglądając listę ciągów. Ale go nie używa.
eleijonmarck

12

Podoba mi się:

df['new'] = pd.Series(dtype='your_required_dtype')

Jeśli masz pustą ramkę danych, to rozwiązanie zapewnia, że ​​nie NaNzostanie dodany żaden nowy wiersz zawierający tylko .

Jeśli dtypenie jest określony, nowsze wersje Pandas tworzą DeprecationWarning.


5

jeśli chcesz dodać nazwę kolumny z listy

df=pd.DataFrame()
a=['col1','col2','col3','col4']
for i in a:
    df[i]=np.nan

4

@ emunsing na odpowiedź jest naprawdę fajne do dodawania wielu kolumn, ale nie mogę zmusić go do pracy dla mnie w Pythonie 2.7. Zamiast tego znalazłem to działa:

mydf = mydf.reindex(columns = np.append( mydf.columns.values, ['newcol1','newcol2'])

1

Poniższy kod dotyczy pytania „Jak dodać n pustych kolumn do mojej istniejącej ramki danych”. Aby zachować rozwiązania podobnych problemów w jednym miejscu, dodam je tutaj.

Podejście 1 (aby utworzyć 64 dodatkowe kolumny o nazwach kolumn od 1 do 64)

m = list(range(1,65,1)) 
dd=pd.DataFrame(columns=m)
df.join(dd).replace(np.nan,'') #df is the dataframe that already exists

Podejście 2 (aby utworzyć 64 dodatkowe kolumny o nazwach kolumn od 1 do 64)

df.reindex(df.columns.tolist() + list(range(1,65,1)), axis=1).replace(np.nan,'')

1

Możesz to zrobić

df['column'] = None #This works. This will create a new column with None type
df.column = None #This will work only when the column is already present in the dataframe 

1

Można użyć df.insert(index_to_insert_at, column_header, init_value)do wstawienia nowej kolumny pod określonym indeksem.

cost_tbl.insert(1, "col_name", "") 

Powyższa instrukcja wstawiłaby pustą kolumnę po pierwszej kolumnie.

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.