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
Это также потерпело неудачу.
Итак, как вы это делаете?
Ответы
Ответ 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