Додавання списку чи серії до панди DataFrame як рядок?


107

Таким чином, я ініціалізував порожні панди DataFrame і хотів би ітеративно додавати списки (або Серії) у вигляді рядків у цій DataFrame. Який найкращий спосіб зробити це?


Кращі відповіді можна знайти за
Yuval Atzmon

Відповіді:


132

Іноді простіше зробити все додавання поза панд, тоді просто створити DataFrame за один кадр.

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

1
Здається, питання означає, що не всі рядки відомі вперед.
DISC-O

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

8
Це найпростіше, якщо ви хочете додати до кінця df.
Сид

2
Це саме те, що я хотів, таке просте, але ефективне!
MSalty

3
Чому це не обрана відповідь?
Лукас Азеведо

Це, як правило, нормально, але працює лише в тому випадку, якщо у вас монотонно зростаючий індекс, який починався з 0.
дрібень


36

Не могли б ви зробити щось подібне?

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

Хтось має більш елегантне рішення?


1
Ось більш просте і німе рішення: `` `імпортувати панди як pd df = pd.DataFrame () df = df.append ({'foo': 1, 'bar': 2}, ignore_index = True) # Зауважте, що це додавання не відбувається на місці. `` `
Джайдев Дешпанде

27

Слідкуйте за відповіддю Майка Чиріко ... якщо ви хочете додати список після того, як кадр даних уже заповнений ...

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

Чи створює це копію? Чи можливо додавати на місці?
lucid_dreamer

4

Якщо ви хочете додати серію та використовувати індекс серії як стовпці DataFrame, вам потрібно лише додати серію між дужками:

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]

Без цього ignore_index=Trueви не отримаєте належного індексу.


4

Ось функція, яка, з огляду на вже створений кадр даних, додасть список як новий рядок. Це, ймовірно, має бути викинуто уловлювачів помилок, але якщо ви точно знаєте, що ви додаєте, це не повинно бути проблемою.

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

Перетворення списку в кадр даних в рамках функції додавання працює, також при застосуванні в циклі

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

2

просто використовуйте 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

1

Як згадувалося тут - https://kite.com/python/answers/how-to-append-a-list-as-a-row-to-a-pandas-dataframe-in-python , спочатку вам потрібно перетворити список у серію, а потім додати серію до фрейму даних.

df = pd.DataFrame([[1, 2], [3, 4]], columns = ["a", "b"])
to_append = [5, 6]
a_series = pd.Series(to_append, index = df.columns)
df = df.append(a_series, ignore_index=True)

0

Найпростіший спосіб:

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

Редагувати:

Не забувайте, що довжина нового списку повинна бути однаковою для відповідного Dataframe.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.