2013-06-13 7 views
67

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

Вот что я пытаюсь сделать. У меня есть 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.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 

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

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

ответ

53

df['y'] установит колонку

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

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

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

я вижу. Таким образом, атрибут 'loc' в кадре данных определяет специальный' __setitem__', который делает магию, я полагаю. – xApple

+0

Можете ли вы построить это за один проход (т. Е. С столбцами, индексом и y)? –

+3

Итак, если я могу генерировать по одной строке за раз, как бы я мог оптимально построить фрейм данных? – xApple

10

Это упрощенная версия

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>']` 
+2

просто хочу спросить, эффективен ли этот процессор и память? – czxttkl

+1

как узнать последнюю строку df, чтобы каждый раз добавлять к последней строке? – pashute

21

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

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

Это работало блестяще для меня, и мне нравится, что вы явно «добавляете» данные в dataframe. –

+0

Обратите внимание, что для этого ответа каждая строка должна содержать имя столбца. То же самое для принятого ответа. – pashute

3

Если входные строки представляют собой списки, а не словари, то следующее простое решение:

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

, но что делать, если у меня есть несколько индексов? df1 = pd.DataFrame (list_of_lists, столбцы ['A', 'B', 'C'], index = ['A', 'B']) не работает. Неправильная форма. Так как? – pashute

Смежные вопросы