Dołączasz listę lub serię do pandy DataFrame jako wiersz?

110

Dlatego zainicjowałem puste pandy DataFrame i chciałbym iteracyjnie dołączać listy (lub serie) jako wiersze w tej ramce DataFrame. Jaki jest najlepszy sposób na zrobienie tego?

Wes Field
źródło
Lepsze odpowiedzi można znaleźć pod
Yuval Atzmon

Odpowiedzi:

134

Czasami łatwiej jest wykonać wszystkie dołączenia poza pandami, a następnie po prostu utworzyć ramkę DataFrame w jednym ujęciu.

>>> import pandas as pd
>>> simple_list=[['a','b']]
>>> simple_list.append(['e','f'])
>>> df=pd.DataFrame(simple_list,columns=['col1','col2'])
   col1 col2
0    a    b
1    e    f
Mike Chirico
źródło
2
Pytanie wydaje się sugerować, że nie wszystkie wiersze są znane z góry.
DISC-O
104
df = pd.DataFrame(columns=list("ABC"))
df.loc[len(df)] = [1,2,3]
Ashot Matevosyan
źródło
8
Jest to najłatwiejsze, jeśli chcesz dodać plik na końcu df.
Sid
2
To jest dokładnie to, czego chciałem, tak proste, ale skuteczne!
Salty
3
Dlaczego nie jest to wybrana odpowiedź?
Lucas Azevedo
1
To jest ogólnie ok, ale działa tylko jeśli masz monotonicznie rosnący indeks, który rozpoczął się od 0.
dreab
60

Oto proste i głupie rozwiązanie:

>>> import pandas as pd
>>> df = pd.DataFrame()
>>> df = df.append({'foo':1, 'bar':2}, ignore_index=True)
Jaidev Deshpande
źródło
26
Zauważ, że jest to dołączenie dyktanda, a nie listy
anthnyprschka
36

Czy mógłbyś zrobić coś takiego?

>>> import pandas as pd
>>> df = pd.DataFrame(columns=['col1', 'col2'])
>>> df = df.append(pd.Series(['a', 'b'], index=['col1','col2']), ignore_index=True)
>>> df = df.append(pd.Series(['d', 'e'], index=['col1','col2']), ignore_index=True) 
>>> df
  col1 col2
0    a    b
1    d    e

Czy ktoś ma bardziej eleganckie rozwiązanie?

Alex Woolford
źródło
1
Oto prostsze i głupie rozwiązanie: `` importuj pandy jako pd df = pd.DataFrame () df = df.append ({'foo': 1, 'bar': 2}, ignore_index = True) # Zauważ, że to dołączenie nie dzieje się na miejscu. ``
Jaidev Deshpande
27

Idąc za odpowiedzią Mike'a Chirico ... jeśli chcesz dołączyć listę po wypełnieniu ramki danych ...

>>> list = [['f','g']]
>>> df = df.append(pd.DataFrame(list, columns=['col1','col2']),ignore_index=True)
>>> df
  col1 col2
0    a    b
1    d    e
2    f    g
Jay Marm
źródło
Czy tworzy kopię? Czy można dołączyć w miejscu?
lucid_dreamer
4

Jeśli chcesz dodać serię i użyć indeksu serii jako kolumn DataFrame, wystarczy dodać serię w nawiasach:

In [1]: import pandas as pd

In [2]: df = pd.DataFrame()

In [3]: row=pd.Series([1,2,3],["A","B","C"])

In [4]: row
Out[4]: 
A    1
B    2
C    3
dtype: int64

In [5]: df.append([row],ignore_index=True)
Out[5]: 
   A  B  C
0  1  2  3

[1 rows x 3 columns]

Bez ignore_index=Truetego nie otrzymasz odpowiedniego indeksu.

bmello
źródło
4

Oto funkcja, która, biorąc pod uwagę już utworzoną ramkę danych, dołączy listę jako nowy wiersz. Powinno to prawdopodobnie mieć wrzucone łapacze błędów, ale jeśli dokładnie wiesz, co dodajesz, nie powinno to stanowić problemu.

import pandas as pd
import numpy as np

def addRow(df,ls):
    """
    Given a dataframe and a list, append the list as a new row to the dataframe.

    :param df: <DataFrame> The original dataframe
    :param ls: <list> The new row to be added
    :return: <DataFrame> The dataframe with the newly appended row
    """

    numEl = len(ls)

    newRow = pd.DataFrame(np.array(ls).reshape(1,numEl), columns = list(df.columns))

    df = df.append(newRow, ignore_index=True)

    return df
jadki
źródło
3

Konwersja listy do ramki danych w ramach funkcji dołączania działa, również w przypadku zastosowania w pętli

import pandas as pd
mylist = [1,2,3]
df = pd.DataFrame()
df = df.append(pd.DataFrame(data[mylist]))
janfelix
źródło
2

po prostu użyj loc:

>>> df
     A  B  C
one  1  2  3
>>> df.loc["two"] = [4,5,6]
>>> df
     A  B  C
one  1  2  3
two  4  5  6
Qinsi
źródło
0

Najprostszy sposób:

my_list = [1,2,3,4,5]
df['new_column'] = pd.Series(my_list).values

Edytować:

Nie zapominaj, że długość nowej listy powinna być taka sama jak odpowiadającej jej ramki danych.

Ghanem
źródło