Простая задача добавления строки к pandas.DataFrame
объекту кажется сложной. По этому поводу есть 3 вопроса о stackoverflow, ни один из которых не дает рабочего ответа.
Вот что я пытаюсь сделать. У меня есть 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
Это тоже с треском провалилось.
Итак, как вы это делаете ?
loc
атрибут фрейма данных определяет специальное значение,__setitem__
которое, как я полагаю, творит чудеса.df = pd.DataFrame({'y': pd.Series(y)}, columns=['a','b','c','d'], index=['x','y','z'])
сработает?Мой подход был таким, но я не могу гарантировать, что это самое быстрое решение.
источник
append
передаете данные в фрейм данных.Это более простая версия
источник
Если ваши входные строки представляют собой списки, а не словари, то следующее простое решение:
источник