Jestem nowy w pandach i próbuję wymyślić, jak jednocześnie dodać wiele kolumn do pand. Każda pomoc jest mile widziana. Idealnie chciałbym to zrobić w jednym kroku, a nie w wielu powtarzanych krokach ...
import pandas as pd
df = {'col_1': [0, 1, 2, 3],
'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)
df[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs',3] #thought this would work here...
KeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"
Odpowiedzi:
Spodziewałbym się, że twoja składnia też zadziała. Problem pojawia się, ponieważ podczas tworzenia nowych kolumn za pomocą składni listy kolumn (
df[[new1, new2]] = ...
), pandy wymagają, aby prawa strona była ramką DataFrame (zwróć uwagę, że w rzeczywistości nie ma znaczenia, czy kolumny DataFrame mają takie same nazwy jak kolumny tworzysz).Twoja składnia działa dobrze przy przypisywaniu wartości skalarnych do istniejących kolumn, a pandy z przyjemnością przypisują wartości skalarne do nowej kolumny za pomocą składni jednokolumnowej (
df[new1] = ...
). Więc rozwiązaniem jest albo przekonwertowanie tego na kilka przypisań jednokolumnowych, albo utworzenie odpowiedniej ramki DataFrame dla prawej strony.Oto kilka podejść, które będą działać:
Następnie jedno z poniższych:
1) Trzy zadania w jednym przy użyciu rozpakowywania list:
2)
DataFrame
wygodnie rozwija pojedynczy wiersz, aby dopasować go do indeksu, więc możesz to zrobić:3) Utwórz tymczasową ramkę danych z nowymi kolumnami, a następnie połącz ją z oryginalną ramką danych później:
4) Podobnie jak poprzednio, ale użycie
join
zamiastconcat
(może być mniej wydajne):5) Używanie dyktu jest bardziej "naturalnym" sposobem tworzenia nowej ramki danych niż dwie poprzednie, ale nowe kolumny będą sortowane alfabetycznie (przynajmniej przed Pythonem 3.6 lub 3.7 ):
6) Używaj
.assign()
z wieloma argumentami kolumnowymi.Bardzo podoba mi się ten wariant odpowiedzi @ zero, ale podobnie jak poprzedni, nowe kolumny będą zawsze sortowane alfabetycznie, przynajmniej we wczesnych wersjach Pythona:
7) To ciekawe (na podstawie https://stackoverflow.com/a/44951376/3830997 ), ale nie wiem, kiedy warto byłoby:
8) Ostatecznie trudno pokonać trzy oddzielne zadania:
Uwaga: wiele z tych opcji zostały już ujęte w innych odpowiedzi: Dodawanie wielu kolumn do DataFrame i ustawić je wynosić do istniejącej kolumny , Czy jest możliwe aby dodać kilka kolumn na raz do pand DataFrame? , Dodaj wiele pustych kolumn do pandy DataFrame
źródło
.reindex
) nie zmieniłoby indeksu ramki danych? Dlaczego ktoś miałby chcieć niepotrzebnie zmieniać indeks podczas dodawania kolumn, chyba że jest to wyraźny cel ....reindex()
jest używany zcolumns
argumentem, więc zmienia tylko kolumnę „indeks” (nazwy). Nie zmienia indeksu wiersza.OrderedDict
: na przykładdf.join(pd.DataFrame( OrderedDict([('column_new_2', 'dogs'),('column_new_1', np.nan),('column_new_3', 3)]), index=df.index ))
df = pd.DataFrame({'before': [1, 2, 3], 'after': [4, 5, 6]})
Kontradf = pd.DataFrame(OrderedDict([('before', [1, 2, 3]), ('after', [4, 5, 6])])
join
, upewnij się, że nie masz duplikatów w swoim indeksie (lub użyjreset_index
pierwszego). Może zaoszczędzić kilka godzin na debugowaniu.Możesz użyć
assign
z dyktowaniem nazw kolumn i wartości.źródło
df.assign(**{'col_new_1': np.nan}).assign(**{'col2_new_2': 'dogs'}).assign(**{'col3_new_3': 3})
df.assign(col_new_1=np.nan, col2_new_2='dogs', col3_new_3=3)
. To utrzymuje porządek.Za pomocą concat :
Nie jestem pewien, z czym chcesz zrobić
[np.nan, 'dogs',3]
. Może teraz ustawić je jako wartości domyślne?źródło
użycie rozumienia list
pd.DataFrame
ipd.concat
źródło
jeśli dodajesz wiele brakujących kolumn (a, b, c, ....) o tej samej wartości, tutaj 0, zrobiłem to:
Opiera się na drugim wariancie zaakceptowanej odpowiedzi.
źródło
Chcę tylko zwrócić uwagę na tę opcję 2 w odpowiedzi @Matthias Fripp
jest już udokumentowane w dokumentacji własnej pand http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
źródło
pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)
replikuje jeden podany wiersz, aby utworzyć całą ramkę danych o tej samej długości co indeks.Jeśli chcesz tylko dodać puste nowe kolumny, reindeks wykona zadanie
przykład pełnego kodu
w przeciwnym razie odpowiedz na zera z przypisaniem
źródło
Nie czuję się komfortowo, używając „indeksu” i tak dalej ... może pojawić się jak poniżej
źródło