Ви написали в коментарі до відповіді Йоріса:
"Я не розумію дизайнерського рішення для перетворення окремих рядків у ряд - чому б не фрейм даних з одним рядком?"
Один рядок не перетворюється в серію.
Це IS Серія:No, I don't think so, in fact; see the edit
Найкращий спосіб думати про структури даних pandas - це гнучкі контейнери для даних менших розмірів. Наприклад, DataFrame є контейнером для серії, а Panel - контейнером для об'єктів DataFrame. Ми хотіли б мати можливість вставляти та видаляти об’єкти з цих контейнерів подібним словником.
http://pandas.pydata.org/pandas-docs/stable/overview.html#why-more-than-1-data-structure
Модель даних об'єктів Pandas була обрана таким чином. Причина, безумовно, полягає в тому, що вона забезпечує деякі переваги, яких я не знаю (я не повністю розумію останнє речення цитати, можливо, це причина)
.
Редагувати: я не згоден зі мною
DataFrame не може складатися з елементів, які були б Series, оскільки наступний код дає той самий тип "Series", а також для рядка, як для стовпця:
import pandas as pd
df = pd.DataFrame(data=[11,12,13], index=[2, 3, 3])
print '-------- df -------------'
print df
print '\n------- df.loc[2] --------'
print df.loc[2]
print 'type(df.loc[1]) : ',type(df.loc[2])
print '\n--------- df[0] ----------'
print df[0]
print 'type(df[0]) : ',type(df[0])
результат
-------- df -------------
0
2 11
3 12
3 13
------- df.loc[2] --------
0 11
Name: 2, dtype: int64
type(df.loc[1]) : <class 'pandas.core.series.Series'>
--------- df[0] ----------
2 11
3 12
3 13
Name: 0, dtype: int64
type(df[0]) : <class 'pandas.core.series.Series'>
Отже, немає сенсу робити вигляд, що DataFrame складається із Series, оскільки якими б мали бути ці згадані Series: стовпцями чи рядками? Дурне питання та бачення.
.
Тоді що таке DataFrame?
У попередній версії цієї відповіді я задав це запитання, намагаючись знайти відповідь на Why is that?
частину питання про ОП та подібний допит single rows to get converted into a series - why not a data frame with one row?
в одному з його коментарів,
тоді як на цю Is there a way to ensure I always get back a data frame?
частину відповів Ден Аллан.
Тоді, як у цитованих вище документах Pandas сказано, що структури даних панд найкраще розглядаються як контейнери даних нижчих розмірів, мені здавалося, що розуміння причини було б знайдено в характеристиках природи структур DataFrame.
Однак я зрозумів, що цю цитовану пораду не слід сприймати як точний опис природи структур даних Пандаса.
Ця порада не означає, що DataFrame - це контейнер Series.
Він висловлює, що уявне представлення DataFrame як контейнера Series (або рядків, або стовпців відповідно до опції, розглянутої в один момент аргументації) є хорошим способом розглянути DataFrames, навіть якщо це не так, насправді. "Добре" означає, що це бачення дозволяє ефективно використовувати DataFrames. Це все.
.
Тоді що таке об’єкт DataFrame?
Клас DataFrame створює екземпляри, які мають певну структуру, що походить від базового класу NDFrame , який сам походить від базового класу PandasContainer, який також є батьківським класом класу Series .
Зауважте, що це правильно для Pandas до версії 0.12. У майбутній версії 0.13 Серія також походитиме лише з класу NDFrame .
# with pandas 0.12
from pandas import Series
print 'Series :\n',Series
print 'Series.__bases__ :\n',Series.__bases__
from pandas import DataFrame
print '\nDataFrame :\n',DataFrame
print 'DataFrame.__bases__ :\n',DataFrame.__bases__
print '\n-------------------'
from pandas.core.generic import NDFrame
print '\nNDFrame.__bases__ :\n',NDFrame.__bases__
from pandas.core.generic import PandasContainer
print '\nPandasContainer.__bases__ :\n',PandasContainer.__bases__
from pandas.core.base import PandasObject
print '\nPandasObject.__bases__ :\n',PandasObject.__bases__
from pandas.core.base import StringMixin
print '\nStringMixin.__bases__ :\n',StringMixin.__bases__
результат
Series :
<class 'pandas.core.series.Series'>
Series.__bases__ :
(<class 'pandas.core.generic.PandasContainer'>, <type 'numpy.ndarray'>)
DataFrame :
<class 'pandas.core.frame.DataFrame'>
DataFrame.__bases__ :
(<class 'pandas.core.generic.NDFrame'>,)
-------------------
NDFrame.__bases__ :
(<class 'pandas.core.generic.PandasContainer'>,)
PandasContainer.__bases__ :
(<class 'pandas.core.base.PandasObject'>,)
PandasObject.__bases__ :
(<class 'pandas.core.base.StringMixin'>,)
StringMixin.__bases__ :
(<type 'object'>,)
Отже, я розумію, що екземпляр DataFrame має певні методи, створені для того, щоб контролювати спосіб вилучення даних із рядків і стовпців.
Способи роботи цих методів вилучення описані на цій сторінці:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing
Ми знаходимо в ньому метод, заданий Деном Алланом та іншими методами.
Чому ці методи вилучення були розроблені як вони були?
Це, безумовно, тому, що вони були оцінені як такі, що надають кращі можливості та полегшують аналіз даних.
Це саме те, що виражено в цьому реченні:
Найкращий спосіб думати про структури даних pandas - це гнучкі контейнери для даних менших розмірів.
Чому екстракції даних з екземпляра DataFRame не лежить в його структурі, вона лежить в чому цієї структури. Я припускаю, що структура та функціонування структури даних Панд були розроблені для того, щоб бути якомога інтелектуально інтуїтивнішим, і що, щоб зрозуміти деталі, потрібно прочитати блог Уеса Мак-Кінні.