Mam ramkę danych:
s1 = pd.Series([5, 6, 7])
s2 = pd.Series([7, 8, 9])
df = pd.DataFrame([list(s1), list(s2)], columns = ["A", "B", "C"])
A B C
0 5 6 7
1 7 8 9
[2 rows x 3 columns]
i muszę dodać pierwszy wiersz [2, 3, 4], aby uzyskać:
A B C
0 2 3 4
1 5 6 7
2 7 8 9
Próbowałem append()
i concat()
funkcjonuję, ale nie mogę znaleźć właściwego sposobu, jak to zrobić.
Jak dodać / wstawić serię do Dataframe?
s1.values
w przeciwieństwie dolist(s1)
tworzenia zupełnie nowej listy przy użyciulist(s1)
.Odpowiedzi:
Po prostu przypisz wiersz do określonego indeksu, używając
loc
:I otrzymujesz, zgodnie z życzeniem:
Zobacz w dokumentacji Pandas Indeksowanie: Ustawienie z powiększeniem .
źródło
df.loc[-1] = df.iloc[[0]]
, i wstawić to? Ramka zawiera dodaną kolumnę indeksu, która powoduje błądValueError: cannot set a row with mismatched columns
(patrz stackoverflow.com/questions/47340571/ ... )df.loc[-1] = [2, 3, 4] # adding a row
jest to trochę mylące, ponieważ-1
nie jest ostatnim wierszem / elementem, jak to ma miejsce w przypadku tablic Pythona.Nie jestem pewien, jak dzwoniłeś,
concat()
ale powinno działać, o ile oba obiekty są tego samego typu. Może problem polega na tym, że musisz rzucić drugi wektor do ramki danych? Użycie df, które zdefiniowałeś, działa dla mnie:źródło
Jednym ze sposobów osiągnięcia tego jest
Generalnie najłatwiej jest dołączać ramki danych, a nie serie. W twoim przypadku, ponieważ chcesz, aby nowy wiersz był „na wierzchu” (z początkowym identyfikatorem) i nie ma funkcji
pd.prepend()
, najpierw tworzę nową ramkę danych, a następnie dołączam starą.ignore_index
zignoruje stary, trwający indeks w ramce danych i zapewni, że pierwszy wiersz faktycznie zaczyna się od indeksu1
zamiast ponownego uruchamiania z indeksem0
.Typowe zastrzeżenie: Cetero censeo ... dołączanie wierszy jest dość nieefektywną operacją. Jeśli zależy Ci na wydajności, a może w jakiś sposób zapewnić, aby najpierw utworzyć dataframe z prawidłowym wskaźnikiem (dłuższy) a potem po prostu wstawiając dodatkowy wiersz do dataframe, powinno się to zrobić. Widzieć:
Jak dotąd mamy to, co miałeś jako
df
:Ale teraz możesz łatwo wstawić wiersz w następujący sposób. Jest to bardziej wydajne, ponieważ miejsce zostało wstępnie przydzielone.
źródło
Złożyłem krótką funkcję, która pozwala na nieco większą elastyczność podczas wstawiania wiersza:
który można dalej skrócić do:
Wtedy możesz użyć czegoś takiego:
gdzie
2
jest pozycja indeksu, wdf
której chcesz wstawićdf_new
.źródło
Możemy użyć
numpy.insert
. Ma to zaletę w postaci elastyczności. Musisz tylko określić indeks, do którego chcesz wstawić.Dla
np.insert(df.values, 0, values=[2, 3, 4], axis=0)
, 0 informuje funkcję o miejscu / indeksie, w którym chcesz umieścić nowe wartości.źródło
to może wydawać się zbyt proste, ale to niesamowite, że prosta funkcja wstawiania nowego wiersza nie jest wbudowana. Wiele czytałem o dołączaniu nowego pliku df do oryginału, ale zastanawiam się, czy byłoby to szybsze.
źródło
Poniżej byłby najlepszy sposób na wstawienie wiersza do ramki danych pandy bez sortowania i resetowania indeksu:
źródło
Dodanie wiersza do pandy jest całkiem proste
DataFrame
:Utwórz zwykły słownik Pythona z takimi samymi nazwami kolumn jak Twój
Dataframe
;Użyj
pandas.append()
metody i przekaż nazwę swojego słownika, gdzie.append()
jest metodą w instancjach DataFrame;Dodaj
ignore_index=True
zaraz po nazwie słownika.źródło
concat()
wydaje się być nieco szybszy niż wstawianie i ponowne indeksowanie ostatniego wiersza. Gdyby ktoś zastanawiał się nad szybkością dwóch najpopularniejszych podejść:17,1 s ± 705 ms na pętlę (średnia ± odchylenie standardowe 7 przebiegów, 1 pętla każdy)
6,53 s ± 127 ms na pętlę (średnia ± odchylenie standardowe 7 przebiegów, 1 pętla każdy)
źródło
Możesz po prostu dołączyć wiersz na końcu ramki DataFrame, a następnie dostosować indeks.
Na przykład:
Lub użyj
concat
jako:źródło
Najprostszym sposobem dodania wiersza w ramce danych pandy jest:
Przykład:
Uwaga: długość twojej listy powinna odpowiadać długości ramki danych.
źródło