Просте завдання додати рядок до pandas.DataFrame
об'єкта, здається, важко виконати. З цим пов'язано 3 запитання про стаціонарний потік, жодне з яких не дає діючої відповіді.
Ось що я намагаюся зробити. У мене є 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__
який виконує магію, яку я думаю.