Чим відрізняється серія панд від одноколонного DataFrame?


168

Чому панди роблять різницю між a Seriesі одноколонкою DataFrame?
Іншими словами: в чому причина існування Seriesкласу?

Я в основному використовую часові ряди з індексом дати, можливо, це допомагає встановити контекст.


Ну вони, очевидно, різні, я думаю, ви маєте на увазі певні операції, які все ще повертають кадр даних або тому, що у вас є лише один фрейм даних колонки, або тому, що операція призводить до одного фрейму даних стовпця. Однак при виборі одного стовпця немає двозначності, і це розкладається на Серію. Ви повинні показати зразок коду, щоб пояснити, у чому полягає ваша проблема.
EdChum

Можливо , пов'язані з : stackoverflow.com/questions/16782323 / ...
EdChum

6
Основне питання полягає в тому, що я не бачу потреби в об'єкті серії, використовуючи різні методи.
saroele

Для одного є різниця в просторі імен. Серії мають лише найменування верхнього рівня, фрейми даних мають верхній рівень та назву стовпця. Це може призвести до значних відмінностей у синтаксисі для обробки / створення нового ряду проти нового стовпця.
JohnE

4
Наскільки я можу сказати, на це питання все ж слід відповісти. Незважаючи на те, можна думати DataFrameяк dictпро Series(хоча це не поточна реалізація), до цих пір неясно , чому ви коли - небудь повертати Seriesоб'єкт замість DataFrame(тобто концептуально dictз одним записом).
Алекс

Відповіді:


190

Цитуючи документи Pandas

pandas.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)

Двовимірна змінна розмір, потенційно неоднорідна таблична структура даних з міченими осями (рядки та стовпці). Арифметичні операції вирівнюються як на мітках рядків, так і стовпців. Можна розглядати як контейнер, що нагадує дикти, для об'єктів Series. Первинна структура даних панд.

Отже, Серія - це структура даних для одного стовпцяDataFrame , причому не тільки концептуально, але й буквально, тобто дані в a DataFrameфактично зберігаються в пам'яті як колекція Series.

Аналогічно: нам потрібні і списки, і матриці, оскільки матриці будуються зі списками. Матриці одного рядка, хоча еквівалентні спискам у функціональності, все ще не можуть існувати без списків, з яких вони складаються.

Вони обидва мають надзвичайно схожі API, але ви побачите, що DataFrameметоди завжди залежать від можливості, що у вас є більше одного стовпця. І, звичайно, ви завжди можете додати інший Series(або еквівалентний об’єкт) до а DataFrame, тоді як додавання Seriesдо іншого Seriesвключає створення DataFrame.


2
Дякую за вашу відповідь. На моє запитання надихнула помилка в моєму коді, коли вибір у фреймі даних несподівано повернув серію замість цього, і я не зміг отримати доступ до атрибута стовпців. Я не тільки один сплутати: stackoverflow.com/questions/16782323 / ...
saroele

Я бачу. Можливо, це допоможе, якби вони мали іншу __repr__поведінку, тож ви не можете їх змішати?
PythonNut

6
Ви не можете нічого зробити висновок про фактичну внутрішню структуру даних DataFrameвід Can be thought of as a dict-like container for Series objects. Насправді він наразі зберігається як BlockManager(що є детальною інформацією про реалізацію, на яку не слід покладатися).
timdiels

1
Я все ще плутаюся, тож коли я буду використовувати фрейм даних єдиного стовпця замість серії?
dhiraj suvarna

4
Я можу бути педантичним, але я не бачу відповіді на питання ОП про те, чому існують серії. Я бачу відповідь, що описує взаємозв'язок між серіями та кадрами даних, але не відповідь, що пояснює, чому нам потрібно хотіти, щоб серія була окремим типом даних, а не окремим випадком фрейму даних (а саме одного із лише одним стовпцем).
MightyCurious

14

з серії pandas doc http://pandas.pydata.org/pandas-docs/stable/dsintro.html - це одновимірний мічений масив, здатний містити будь-який тип даних. Для читання даних у вигляді серії панда:

import pandas as pd
ds = pd.Series(data, index=index)

DataFrame - це двовимірна структура даних з міткою зі стовпцями потенційно різних типів.

import pandas as pd
df = pd.DataFrame(data, index=index)

В обох наведених вище індекс є списком

наприклад: У мене є файл csv із такими даними:

,country,popuplation,area,capital
BR,Brazil,10210,12015,Brasile
RU,Russia,1025,457,Moscow
IN,India,10458,457787,New Delhi

Щоб прочитати наведені вище дані у вигляді серії та кадру даних:

import pandas as pd
file_data = pd.read_csv("file_path", index_col=0)
d = pd.Series(file_data.country, index=['BR','RU','IN'] or index =  file_data.index)

вихід:

>>> d
BR           Brazil
RU           Russia
IN            India

df = pd.DataFrame(file_data.area, index=['BR','RU','IN'] or index = file_data.index )

вихід:

>>> df
      area
BR   12015
RU     457
IN  457787

2
якщо хтось докладе зусиль, щоб ви також спромоглися зазначити причину?
Умеш Каушик

2
Я не заявив, але ваш код не працює. Ви можете змінити , file_dataщоб bricsдодати рядок США в CSV, і зміни ['BR'....'US']в brics.index. Можливо, правильно pupuplation.
RolfBly

@RolfBly: Дякую за вказівку на ці помилки. З мого боку було нерозумно їх зробити. Я їх змінив. Дякую! А щодо читання цього прикладу я взяв звідси випадкові значення.
Умеш Каушик

4

Серія - це одновимірний об'єкт, який може містити будь-який тип даних, такий як цілі числа, поплавці та рядки, наприклад

   import pandas as pd
   x = pd.Series([A,B,C]) 

0 A
1 B
2 C

Перший стовпець серії відомий як індекс, тобто 0,1,2 другий стовпець - це ваші фактичні дані, тобто A, B, C

DataFrames - це двовимірний об'єкт, який може вміщувати серію, список, словник

df=pd.DataFrame(rd(5,4),['A','B','C','D','E'],['W','X','Y','Z'])

2

Серія - це одновимірний мічений масив, здатний містити будь-який тип даних (цілі числа, рядки, числа з плаваючою комою, об'єкти Python тощо). Мітки осі спільно називають індексом. Основний метод створення серії - викликати:

s = pd.Series(data, index=index)

DataFrame - це двовимірна структура даних з міткою зі стовпцями потенційно різних типів. Ви можете думати про це як електронну таблицю або таблицю SQL, або диктат об'єктів Series.

 d = {'one' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
 two' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
 df = pd.DataFrame(d)

0

Імпорт даних про автомобілі

import pandas as pd

cars = pd.read_csv('cars.csv', index_col = 0)

Ось як виглядає файл cars.csv.

Роздрукуйте стовпчик drive_right як серія

print(cars.loc[:,"drives_right"])

    US      True
    AUS    False
    JAP    False
    IN     False
    RU      True
    MOR     True
    EG      True
    Name: drives_right, dtype: bool

Версія з однією дужкою дає серію Pandas, версія з подвійною дужкою дає DataFrame Pandas.

Роздрукуйте стовпчик drive_right як DataFrame

print(cars.loc[:,["drives_right"]])

         drives_right
    US           True
    AUS         False
    JAP         False
    IN          False
    RU           True
    MOR          True
    EG           True

Додавання серії до іншої серії створює DataFrame.


1
дякую за редагування Зараз це виглядає набагато краще. @Zoe
abhishek_7081
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.