Bạn đã viết một bình luận cho câu trả lời của joris:
"Tôi không hiểu quyết định thiết kế để các hàng đơn lẻ được chuyển đổi thành một chuỗi - tại sao không phải là một khung dữ liệu có một hàng?"
Một hàng không được chuyển đổi trong một Chuỗi.
Đó là một loạt:No, I don't think so, in fact; see the edit
Cách tốt nhất để nghĩ về cấu trúc dữ liệu của gấu trúc là các vùng chứa linh hoạt cho dữ liệu có chiều thấp hơn. Ví dụ: DataFrame là vùng chứa cho Series và Panel là vùng chứa cho các đối tượng DataFrame. Chúng tôi muốn có thể chèn và xóa các đối tượng khỏi các vùng chứa này theo cách giống như từ điển.
http://pandas.pydata.org/pandas-docs/stable/overview.html#why-more-than-1-data- architects
Mô hình dữ liệu của các đối tượng Pandas đã được lựa chọn như vậy. Lý do chắc chắn nằm ở chỗ nó đảm bảo một số ưu điểm mà tôi không biết (tôi không hiểu hết câu cuối cùng của trích dẫn, có thể đó là lý do)
.
Chỉnh sửa: Tôi không đồng ý với tôi
Một DataFrame không được bao gồm các phần tử sẽ là Chuỗi, vì mã sau cung cấp cùng loại "Chuỗi" cho một hàng cũng như cho một cột:
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])
kết quả
-------- 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'>
Vì vậy, không có ý nghĩa gì khi giả vờ rằng một DataFrame bao gồm Chuỗi vì những gì mà những Chuỗi đã nói này được cho là: cột hay hàng? Câu hỏi ngu ngốc và tầm nhìn.
.
Vậy thì DataFrame là gì?
Trong phiên bản trước của câu trả lời này, tôi đã hỏi câu hỏi này, cố gắng tìm câu trả lời cho Why is that?
phần câu hỏi của OP và câu hỏi tương tự single rows to get converted into a series - why not a data frame with one row?
trong một trong những bình luận của anh ấy,
trong khiIs there a way to ensure I always get back a data frame?
phần đã được trả lời bởi Dan Allan.
Sau đó, như các tài liệu của gấu trúc được trích dẫn ở trên nói rằng cấu trúc dữ liệu của gấu trúc được xem tốt nhất là các thùng chứa dữ liệu chiều thấp hơn, đối với tôi dường như sự hiểu biết về lý do tại sao sẽ được tìm thấy trong các đặc điểm về bản chất của cấu trúc DataFrame.
Tuy nhiên, tôi nhận ra rằng lời khuyên được trích dẫn này không được coi là mô tả chính xác về bản chất cấu trúc dữ liệu của Pandas.
Lời khuyên này không có nghĩa là DataFrame là một vùng chứa của Series.
Nó thể hiện rằng biểu diễn tinh thần của DataFrame như một vùng chứa Chuỗi (hàng hoặc cột theo tùy chọn được xem xét tại một thời điểm lý luận) là một cách tốt để xem xét DataFrame, ngay cả khi nó không hoàn toàn như vậy trong thực tế. "Tốt" nghĩa là tầm nhìn này cho phép sử dụng DataFrames một cách hiệu quả. Đó là tất cả.
.
Vậy thì đối tượng DataFrame là gì?
Lớp DataFrame tạo ra các cá thể có cấu trúc cụ thể bắt nguồn từ lớp cơ sở NDFrame , bản thân nó có nguồn gốc từ lớp cơ sở PandasContainer cũng là lớp cha của lớp Series .
Lưu ý rằng điều này đúng với Gấu trúc cho đến phiên bản 0.12. Trong phiên bản 0.13 sắp tới, Series cũng sẽ chỉ xuất phát từ lớp 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__
kết quả
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'>,)
Vì vậy, hiểu biết của tôi là bây giờ một cá thể DataFrame có một số phương thức nhất định đã được tạo ra để kiểm soát cách dữ liệu được trích xuất từ các hàng và cột.
Cách thức hoạt động của các phương pháp giải nén này được mô tả trong trang này:
http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing
Chúng tôi tìm thấy trong đó phương pháp do Dan Allan đưa ra và các phương pháp khác.
Tại sao những phương pháp trích xuất này lại được chế tạo như cũ?
Đó là chắc chắn bởi vì chúng đã được đánh giá là những thứ mang lại khả năng tốt hơn và dễ dàng hơn trong việc phân tích dữ liệu.
Đó chính xác là những gì được diễn đạt trong câu này:
Cách tốt nhất để nghĩ về cấu trúc dữ liệu của gấu trúc là các vùng chứa linh hoạt cho dữ liệu có chiều thấp hơn.
Lý do tại sao trích xuất dữ liệu từ một cá thể DataFRame không nằm ở cấu trúc của nó, nó nằm ở lý do tại sao cấu trúc này. Tôi đoán rằng cấu trúc và chức năng của cấu trúc dữ liệu của Pandas đã được đục đẽo để trở nên trực quan nhất có thể, và để hiểu chi tiết, người ta phải đọc blog của Wes McKinney.