Wydaje się, że proste zadanie dodania wiersza do pandas.DataFrame
obiektu jest trudne. Istnieją 3 pytania związane z przepełnieniem stosu, z których żadne nie daje roboczej odpowiedzi.
Oto, co próbuję zrobić. Mam DataFrame, której kształt już znam, a także nazwy wierszy i kolumn.
>>> 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
Teraz mam funkcję do iteracyjnego obliczania wartości wierszy. Jak mogę wypełnić jeden z wierszy słownikiem lub pandas.Series
? Oto różne próby, które zakończyły się niepowodzeniem:
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df['y'] = y
AssertionError: Length of values does not match length of index
Najwyraźniej próbował dodać kolumnę zamiast wiersza.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.join(y)
AttributeError: 'builtin_function_or_method' object has no attribute 'is_unique'
Bardzo mało informacyjny komunikat o błędzie.
>>> 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)
Najwyraźniej służy to tylko do ustawiania indywidualnych wartości w ramce danych.
>>> y = {'a':1, 'b':5, 'c':2, 'd':3}
>>> df.append(y)
Exception: Can only append a Series if ignore_index=True
Cóż, nie chcę ignorować indeksu, w przeciwnym razie oto wynik:
>>> 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
Wyrównał nazwy kolumn z wartościami, ale utracił etykiety wierszy.
>>> 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
To też się nie udało.
Jak więc to robisz?
loc
atrybut ramki danych definiuje specjalną,__setitem__
która robi magię, jak przypuszczam.df = pd.DataFrame({'y': pd.Series(y)}, columns=['a','b','c','d'], index=['x','y','z'])
zadziała?Moje podejście było takie, ale nie mogę zagwarantować, że jest to najszybsze rozwiązanie.
df = pd.DataFrame(columns=["firstname", "lastname"]) df = df.append({ "firstname": "John", "lastname": "Johny" }, ignore_index=True)
źródło
append
dane są jawnie przesyłane do ramki danych.To jest prostsza wersja
import pandas as pd df = pd.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>']`
źródło
Jeśli wiersze wejściowe to listy, a nie słowniki, proste rozwiązanie jest następujące:
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
źródło