Anexar uma lista ou série a um DataFrame do pandas como uma linha?


Respostas:


132

Às vezes é mais fácil fazer todos os acréscimos fora dos pandas, então, basta criar o DataFrame de uma vez.

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

22
Má prática para nomear uma variável list. Você acabou de substituir o listconstrutor.
Jason Strimpel de

1
A pergunta parece implicar que nem todas as linhas são conhecidas antecipadamente.
DISC-O de

103
df = pd.DataFrame(columns=list("ABC"))
df.loc[len(df)] = [1,2,3]

8
Isso é mais fácil se você quiser adicionar ao final do df.
Sid

2
Isso é exatamente o que eu queria, tão simples, mas eficaz!
MSalty

3
Por que esta não é a resposta selecionada?
Lucas Azevedo

Isso geralmente está ok, mas só funciona se você tiver um índice monotonicamente crescente que começou em 0.
dreab

59

Aqui está uma solução simples e estúpida:

>>> import pandas as pd
>>> df = pd.DataFrame()
>>> df = df.append({'foo':1, 'bar':2}, ignore_index=True)

25
Observe que isso é anexar um dicionário, não uma lista
anthnyprschka

36

Você poderia fazer algo assim?

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

Alguém tem uma solução mais elegante?


1
Aqui está uma solução mais simples e burra: `` `import pandas as pd df = pd.DataFrame () df = df.append ({'foo': 1, 'bar': 2}, ignore_index = True) # Observe que este anexo não acontece no lugar. `` `
Jaidev Deshpande

27

Seguindo a resposta de Mike Chirico ... se você quiser adicionar uma lista depois que o dataframe já estiver preenchido ...

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

Isso cria uma cópia? É possível anexar no local?
lucid_dreamer

4

Se você quiser adicionar uma série e usar o índice da série como colunas do DataFrame, você só precisa acrescentar a série entre colchetes:

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]

Sem o, ignore_index=Truevocê não obtém o índice adequado.


4

Aqui está uma função que, dado um dataframe já criado, irá anexar uma lista como uma nova linha. Provavelmente, deve haver coletores de erros inseridos, mas se você souber exatamente o que está adicionando, isso não deve ser um problema.

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

Converter a lista em um quadro de dados dentro da função append funciona, também quando aplicada em um loop

import pandas as pd
mylist = [1,2,3]
df = pd.DataFrame()
df = df.append(pd.DataFrame(data[mylist]))

2

simplesmente use 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

A maneira mais simples:

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

Editar:

Não se esqueça de que o comprimento da nova lista deve ser o mesmo do Dataframe correspondente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.