Python pandas: wypełnij ramkę danych wiersz po wierszu

Proste zadanie dodawania wiersza do pandas.DataFrame wydaje się być trudne do wykonania. Istnieją 3 pytania stoskoverflow związane z tym, z których żadne nie daje odpowiedzi roboczej.

Oto, co próbuję zrobić. Mam ramkę danych, z której znam już kształt, 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 obliczania wartości wierszy iteracyjnie. 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 nieświadomy 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)

Widocznie jest to tylko do ustawiania pojedynczych 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 stracił 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 również nie powiodło się.

Więc jak robisz to ?

Author: xApple, 2013-06-13

4 answers

df['y'] ustawia kolumnę

Ponieważ chcesz ustawić wiersz, użyj .loc

Zauważ, że .ix jest tu równoważne, twoje nie powiodło się, ponieważ próbowałeś przypisać słownik do każdego elementu wiersza y prawdopodobnie nie to co chcesz; konwersja na szereg mówi że chcesz wyrównać dane wejściowe (na przykład nie musisz podawać wszystkich elementów)

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
 61
Author: Jeff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-13 16:19:28

Moje podejście było, 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)
 37
Author: flow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-12 16:31:51

Jest to prostsza wersja

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>']`
 18
Author: Satheesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-28 13:24:22

Jeśli wiersze wejściowe są listami, a nie słownikami, oto proste rozwiązanie:

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
 9
Author: stackoverflowuser2010,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-03 21:46:55