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?


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

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]

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)

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?


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

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.


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

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]))

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


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.

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.