В комментарии к ответу Джориса вы написали:
«Я не понимаю конструктивного решения для преобразования отдельных строк в серию - почему бы не создать фрейм данных с одной строкой?»
Одна строка не преобразуется в серию.
Это IS Серия:No, I don't think so, in fact; see the edit
Лучше всего думать о структурах данных pandas как о гибких контейнерах для низкоразмерных данных. Например, DataFrame - это контейнер для Series, а 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, процитированные выше, говорят, что структуры данных pandas лучше всего рассматривать как контейнеры низкоразмерных данных, мне казалось, что понимание причины можно найти в характеристиках природы структур DataFrame.
Однако я понял, что этот процитированный совет не следует воспринимать как точное описание природы структур данных Pandas.
Этот совет не означает, что DataFrame является контейнером Series.
Он выражает то, что мысленное представление DataFrame как контейнера Series (строк или столбцов в соответствии с вариантом, рассматриваемым в один момент рассуждения) - хороший способ рассмотреть DataFrames, даже если это не совсем так в действительности. «Хорошо» означает, что это видение позволяет эффективно использовать DataFrames. Вот и все.
.
Тогда что такое объект DataFrame?
Класс DataFrame создает экземпляры, имеющие определенную структуру, происходящую из базового класса NDFrame , который сам является производным от базового класса PandasContainer, который также является родительским классом класса Series .
Обратите внимание, что это верно для Pandas до версии 0.12. В следующей версии 0.13 Series будет производным только от класса NDFrame .
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 не лежит в его структуре, она лежит в почему этой структуры. Я предполагаю, что структура и функционирование структуры данных Pandas были тщательно продуманы, чтобы быть максимально интуитивно понятными, и что для понимания деталей нужно прочитать блог Уэса МакКинни.