Rozumiem, że pandy są zaprojektowane do ładowania w pełni wypełnionych, DataFrame
ale muszę utworzyć pustą ramkę danych, a następnie dodać wiersze, jeden po drugim . Jak najlepiej to zrobić?
Pomyślnie utworzyłem pustą ramkę danych z:
res = DataFrame(columns=('lib', 'qty1', 'qty2'))
Następnie mogę dodać nowy wiersz i wypełnić pole:
res = res.set_value(len(res), 'qty1', 10.0)
Działa, ale wydaje się bardzo dziwny: - / (nie udaje się dodać wartości ciągu)
Jak mogę dodać nowy wiersz do DataFrame (z innym typem kolumn)?
Odpowiedzi:
źródło
.loc
odwołuje się do kolumny indeksu, więc jeśli pracujesz z istniejącą wcześniej ramką danych z indeksem, który nie jest ciągłą sekwencją liczb całkowitych rozpoczynających się od 0 (jak w twoim przykładzie),.loc
zastąpi istniejące wiersze lub wstawi wiersze lub tworzyć luki w indeksie. Bardziej niezawodnym (ale nie niezawodnym) podejściem do dodawania istniejącej ramki danych o niezerowej długości byłoby:df.loc[df.index.max() + 1] = [randint(...
lub wstępne wypełnianie indeksu, jak sugerował @FooBar.df.index.max()
występuje,nan
gdy DataFrame jest pusta.df.loc[0 if pd.isnull(df.index.max()) else df.index.max() + 1]
W przypadku, gdy można uzyskać wszystkie dane dla ramki danych z góry, istnieje znacznie szybsze podejście niż dołączanie do ramki danych:
Miałem podobne zadanie, dla którego dołączanie do ramki danych wiersz po rzędzie trwało 30 minut, a tworzenie ramki danych z listy słowników ukończonych w ciągu kilku sekund.
źródło
It is worth noting however, that concat (and therefore append) makes a full copy of the data, and that constantly reusing this function can create a significant performance hit. If you need to use the operation over several datasets, use a list comprehension.
( pandas.pydata.org/pandas-docs/stable/… )Możesz użyć
pandas.concat()
lubDataFrame.append()
. Aby uzyskać szczegółowe informacje i przykłady, zobacz Scalanie, łączenie i konkatenacja .źródło
.loc
mechanizmu, którego można uniknąć, zwłaszcza jeśli jesteś ostrożny.DataFrame.append()
, musisz przede wszystkim upewnić się, że dane wiersza są również DataFrame, a nie listą.Minęło dużo czasu, ale ja też miałem ten sam problem. I znalazłem tutaj wiele ciekawych odpowiedzi. Byłem więc zdezorientowany, jakiej metody użyć.
W przypadku dodawania wielu wierszy do ramki danych interesuje mnie wydajność prędkości . Wypróbowałem więc 4 najpopularniejsze metody i sprawdziłem ich szybkość.
ZAKTUALIZOWANO W 2019 R. przy użyciu nowych wersji pakietów. Zaktualizowano również po komentarzu @FooBar
WYDAJNOŚĆ PRĘDKOŚCI
Wyniki (w sekundach):
Również dzięki @krassowski za przydatny komentarz - zaktualizowałem kod.
Więc używam dodawania przez słownik dla siebie.
Kod:
PS Uważam, że moja realizacja nie jest idealna i może jest jakaś optymalizacja.
źródło
df2.index.max()
dla.loc
niepotrzebnie zwiększa złożoność obliczeniową. Prostedf2.loc[i] = ...
by zrobiło. Dla mnie skrócił czas z 10 do 8,64 sJeśli znasz liczbę wpisów ex ante, powinieneś wstępnie przydzielić miejsce, podając również indeks (biorąc przykład danych z innej odpowiedzi):
Porównanie prędkości
I - zgodnie z komentarzami - przy wielkości 6000 różnica prędkości staje się jeszcze większa:
źródło
źródło
Aby uzyskać skuteczne dołączanie, zobacz Jak dodać dodatkowy wiersz do ramki danych pand i Ustawienia z powiększeniem .
Dodaj wiersze poprzez
loc/ix
na nieistniejących kluczowych danych indeksowych. np .:Lub:
źródło
Możesz dołączyć pojedynczy wiersz jako słownik, korzystając z
ignore_index
opcji.źródło
f.append(<stuff>)
tworzy nowy obiekt, a nie tylko dołącza się do bieżącego obiektu w miejscu, więc jeśli próbujesz dołączyć do ramki danych w skrypcie, musisz powiedziećf = f.append(<stuff>)
Ze względu na język Pythona dodaj moją odpowiedź:
źródło
Możesz także zbudować listę list i przekonwertować ją na ramkę danych -
dający
źródło
To nie jest odpowiedź na pytanie OP, ale zabawkowy przykład ilustrujący odpowiedź @ShikharDua, powyżej której uważam ją za bardzo przydatną.
Chociaż ten fragment jest trywialny, w rzeczywistych danych miałem 1000 wierszy i wiele kolumn, i chciałem móc grupować według różnych kolumn, a następnie wykonać poniższe statystyki dla więcej niż jednej kolumny taget. Posiadanie niezawodnej metody budowania ramki danych po jednym wierszu na raz było wielką wygodą. Dziękuję @ShikharDua!
źródło
Wymyślił prosty i przyjemny sposób:
źródło
Za pomocą obiektu generatora można utworzyć ramkę danych, która będzie bardziej wydajna pod względem pamięci na liście.
Aby dodać raw do istniejącej DataFrame, możesz użyć metody append.
źródło
Utwórz nowy rekord (ramkę danych) i dodaj do old_data_frame .
przekaż listę wartości i odpowiednich nazw kolumn, aby utworzyć nowy rekord (ramka danych)
źródło
Oto sposób dodania / dołączenia wiersza
pandas DataFrame
Można go użyć do wstawienia / dołączenia wiersza w pustej lub zapełnionej pandach DataFrame
źródło
Zamiast listy słowników, jak w odpowiedzi ShikharDua, możemy również przedstawić naszą tabelę jako słownik list , w którym każda lista przechowuje jedną kolumnę w kolejności wierszy, pod warunkiem , że znamy nasze kolumny wcześniej. Na koniec tworzymy naszą ramkę danych raz.
Dla c kolumn i n wierszy używa to 1 słownika i list c , w porównaniu do 1 listy i n słowników. Metoda listy słowników zawiera wszystkie słowniki do przechowywania wszystkich kluczy i wymaga utworzenia nowego słownika dla każdego wiersza. Tutaj dołączamy tylko do list, co jest stałym czasem i teoretycznie bardzo szybkim.
źródło
jeśli chcesz dodać wiersz na końcu, dodaj go jako listę
źródło
Innym sposobem na to (prawdopodobnie mało wydajnym):
Możesz także ulepszyć klasę DataFrame w następujący sposób:
źródło
Uprość to. Przyjmując listę jako dane wejściowe, które zostaną dołączone jako wiersz w ramce danych: -
źródło
Wszystko czego potrzebujesz to
loc[df.shape[0]]
lubloc[len(df)]
lub
źródło
Często widzimy konstrukcję
df.loc[subscript] = …
do przypisania do jednego wiersza DataFrame. Mikhail_Sam opublikował testy porównawcze zawierające między innymi ten konstrukt, a także metodę wykorzystującą dict i ostatecznie DataFrame . Zdecydował, że ten drugi jest zdecydowanie najszybszy. Ale jeślidf3.loc[i] = …
zastąpimy (z wstępnie przydzielonym DataFrame) w jego kodziedf3.values[i] = …
, wynik zmienia się znacząco, ponieważ ta metoda działa podobnie do metody używającej dict. Dlatego powinniśmy częściej braćdf.values[subscript] = …
pod uwagę wykorzystanie. Należy jednak pamiętać, że.values
pobiera indeks dolny od zera, który może różnić się od DataFrame.index.źródło
# .loc with prealloc
), innym przykładem jest pytanie, czy muszę porównywać dane z każdego wiersza Pandas DataFrame z danymi z pozostałych wierszy, czy istnieje sposób na przyspieszenie obliczeń ? i jego zaakceptowana odpowiedź.pandas.DataFrame.append
DataFrame.append (self, other, ignore_index = False, valid_integrity = False, sort = False) → „DataFrame”
Przy ignore_index ustawionym na True:
źródło
przed dodaniem wiersza musimy przekonwertować ramkę danych na słownik, aby zobaczyć klucze jako kolumny w ramce danych, a wartości kolumn są ponownie przechowywane w słowniku, ale kluczem do każdej kolumny jest numer indeksu w ramce danych. Ten pomysł zmusza mnie do napisania poniższego kodu.
źródło
W tym celu można połączyć dwie ramki danych. Zasadniczo natknąłem się na ten problem, aby dodać nowy wiersz do istniejącej ramki danych z indeksem znaków (nie numerycznym). Wprowadzam więc dane dla nowego wiersza w duct () i indeksuję na liście.
źródło
To zajmie się dodaniem elementu do pustej ramki danych. Problem polega na tym, że
df.index.max() == nan
w przypadku pierwszego indeksu:źródło