Dodaj kolumnę do ramki danych o stałej wartości


187

Mam istniejącą ramkę danych, którą muszę dodać dodatkową kolumnę, do której będzie zawierać tę samą wartość dla każdego wiersza.

Istniejące df:

Date, Open, High, Low, Close
01-01-2015, 565, 600, 400, 450

Nowy plik df:

Name, Date, Open, High, Low, Close
abc, 01-01-2015, 565, 600, 400, 450

Wiem, jak dołączyć istniejącą kolumnę serii / ramki danych. Jest to jednak inna sytuacja, ponieważ wszystko, czego potrzebuję, to dodać kolumnę „Nazwa” i ustawić każdy wiersz na tę samą wartość, w tym przypadku „abc”.

Odpowiedzi:


295

df['Name']='abc' doda nową kolumnę i ustawi wszystkie wiersze do tej wartości:

In [79]:

df
Out[79]:
         Date, Open, High,  Low,  Close
0  01-01-2015,  565,  600,  400,    450
In [80]:

df['Name'] = 'abc'
df
Out[80]:
         Date, Open, High,  Low,  Close Name
0  01-01-2015,  565,  600,  400,    450  abc

35
Czy jest na to inny sposób? Otrzymuję ostrzeżenie. Wartość próbuje zostać ustawiona na kopii wycinka z DataFrame. Spróbuj zamiast tego użyć .loc [wiersz_indexer, col_indexer] = wartość. Zobacz zastrzeżenia w dokumentacji: pandas.pydata.org/pandas-docs/stable/…
viswanath

3
Oznacza to, że przypisujesz coś, co jest kopią, a nie oryginalną wersją pliku, nie mogę komentować dalej, nie widząc danych i kodu w formie pytania. Odpowiedzi na pytania w komentarzach są bezproduktywne. Ten kod działa, zrobiłeś coś wcześniej, aby podnieść ostrzeżenie
EdChum,

@vishnuviswanath Dostaję dokładnie takie samo ostrzeżenie jak ty, kiedy korzystam z Jupyter Notebook. Zdarza mi się, gdy mam nietrywialne rozmiary DataFrame (> 200 rekordów) i pewne kombinacje przypisania i po prostu wydrukowania pliku df.
Bill

4
@ vishnuviswanathath prawdopodobnie wcześniej utworzyłeś wycinek oryginalnej ramki danych, a następnie próbujesz ustawić nową kolumnę na tym wycinku. Zamiast tego dodaj nową kolumnę do oryginalnej ramki danych, a następnie utwórz plasterek. Prawdopodobnie podczas tworzenia wycinka ramki danych pandy nie tworzą kopii i jakoś zarządzają nią z oryginalnej ramki danych. Ten rodzaj bałaganu z tą optymalizacją, a więc i ostrzeżeniem.
amit_saxena

2
Aby obejść wspomniane ostrzeżenie o pandach, po prostu uzyskaj kopię ramki danych .copy()przed jej użyciem (chyba że jest ogromna lub coś lub wydajność naprawdę się liczy).
matanster

61

Możesz użyć, insertaby określić, gdzie ma być nowa kolumna. W tym przypadku używam 0do umieszczenia nowej kolumny po lewej stronie.

df.insert(0, 'Name', 'abc')

  Name        Date  Open  High  Low  Close
0  abc  01-01-2015   565   600  400    450

To mi nie działa. Moja oryginalna matryca jest 1460 x 41 i jestem próbuje dodać kolumnę z 1-ki do przodu: df.insert(0,'coef_fix',1). Używam JupyterLab z Python 3.0
ColinMac

2
Działa dobrze dla mnie. Być może nie zauważyłeś, że insertdziała inplace. Oznacza to, że wartość nowej ramki danych nie jest zwracana, ale oryginalna ramka danych została zmodyfikowana. Spróbuj tegodf = pd.DataFrame(0, range(1460), range(41)); df.insert(0, 'coef_fix', 1); df
piRSquared,

44

Działa pojedyncza wkładka

df['Name'] = 'abc'

Tworzy Namekolumnę i ustawia wszystkie wiersze na abcwartości


41

Podsumowując to, co zasugerowali inni, i dodając trzeci sposób

Możesz:

  • przypisać (** kwargs) :

    df.assign(Name='abc')
  • wejdź do nowej serii kolumn (zostanie utworzona) i ustaw ją:

    df['Name'] = 'abc'
  • insert (loc, column, value, allow_duplicates = False)

    df.insert(0, 'Name', 'abc')

    gdzie argument loc (0 <= loc <= len (kolumny)) pozwala wstawić kolumnę tam, gdzie chcesz.

    „loc” daje indeks, w którym będzie kolumna po wstawieniu. Na przykład powyższy kod wstawia nazwę kolumny jako kolumnę 0, tzn. Zostanie wstawiona przed pierwszą kolumną, stając się nową pierwszą kolumną. (Indeksowanie zaczyna się od 0).

Wszystkie te metody pozwalają również dodać nową kolumnę z Serii (wystarczy zastąpić domyślny argument „abc” powyżej serią).

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.