Подтвердить что ты не робот

Python pandas: заполнить строку данных по строкам

Простую задачу добавления строки в объект pandas.DataFrame представляется сложной задачей. Есть три вопроса о стеке, связанных с этим, ни один из которых не дает рабочего ответа.

Вот что я пытаюсь сделать. У меня есть DataFrame, из которого я уже знаю форму, а также имена строк и столбцов.

>>> df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])
>>> df
     a    b    c    d
x  NaN  NaN  NaN  NaN
y  NaN  NaN  NaN  NaN
z  NaN  NaN  NaN  NaN

Теперь у меня есть функция для вычисления значений строк итеративно. Как я могу заполнить одну из строк либо словарем, либо pandas.Series? Вот несколько неудачных попыток:

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df['y'] = y
AssertionError: Length of values does not match length of index

По-видимому, он попытался добавить столбец вместо строки.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'

Очень неинформативное сообщение об ошибке.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.set_value(index='y', value=y)
TypeError: set_value() takes exactly 4 arguments (3 given)

По-видимому, это только для установки отдельных значений в фрейме данных.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True

Ну, я не хочу игнорировать индекс, иначе вот результат:

>>> df.append(y, ignore_index=True)
     a    b    c    d
0  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN  NaN
2  NaN  NaN  NaN  NaN
3    1    5    2    3

Он сопоставил имена столбцов со значениями, но потерял метки строк.

>>> y = {'a':1, 'b':5, 'c':2, 'd':3} 
>>> df.ix['y'] = y
>>> df
                                  a                                 b  \
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

                                  c                                 d
x                               NaN                               NaN
y  {'a': 1, 'c': 2, 'b': 5, 'd': 3}  {'a': 1, 'c': 2, 'b': 5, 'd': 3}
z                               NaN                               NaN

Это также потерпело неудачу.

Итак, как вы это делаете?

4b9b3361

Ответ 1

df['y'] установит столбец

так как вы хотите установить строку, используйте .loc

Обратите внимание, что .ix здесь эквивалентен, ваши неудачи, потому что вы пытались назначить словарь для каждого элемента строки y, вероятно, не то, что вы хотите; преобразование в серию сообщает pandas что вы хотите выровнять входные данные (например, вам не нужно указывать все элементы)

In [7]: df = pandas.DataFrame(columns=['a','b','c','d'], index=['x','y','z'])

In [8]: df.loc['y'] = pandas.Series({'a':1, 'b':5, 'c':2, 'd':3})

In [9]: df
Out[9]: 
     a    b    c    d
x  NaN  NaN  NaN  NaN
y    1    5    2    3
z  NaN  NaN  NaN  NaN

Ответ 2

Мой подход был, но я не могу гарантировать, что это самое быстрое решение.

df = pd.Dataframe(columns=["firstname", "lastname"])
df = df.append({
     "firstname": "John",
     "lastname":  "Johny"
      }, ignore_index=True)

Ответ 3

Это более простая версия

df = DataFrame(columns=('col1', 'col2', 'col3'))
for i in range(5):
   df.loc[i] = ['<some value for first>','<some value for second>','<some value for third>']`

Ответ 4

Если ваши входные строки являются списками, а не словарями, то это простое решение:

import pandas as pd
list_of_lists = []
list_of_lists.append([1,2,3])
list_of_lists.append([4,5,6])

pd.DataFrame(list_of_lists, columns=['A', 'B', 'C'])
#    A  B  C
# 0  1  2  3
# 1  4  5  6