পান্ডারা লেবেল দ্বারা নির্বাচন করা কখনও কখনও সিরিজ ফেরত দেয়, কখনও কখনও ডেটাফ্রেম দেয়


98

পান্ডাসে, যখন আমি সূচীতে কেবল একটি এন্ট্রি রয়েছে এমন একটি লেবেল নির্বাচন করি তখন আমি একটি সিরিজ ফিরে পাই, তবে আমি যখন আরও একটি প্রবেশিকা নির্বাচন করি তখন একটি প্রবেশিকা নির্বাচন করি তখন আমি একটি ডেটা ফ্রেম ফিরে পাই।

তা কেন? আমি সবসময় ডেটা ফ্রেম ফিরে পেতে পারি তা নিশ্চিত করার কোনও উপায় আছে কি?

In [1]: import pandas as pd

In [2]: df = pd.DataFrame(data=range(5), index=[1, 2, 3, 3, 3])

In [3]: type(df.loc[3])
Out[3]: pandas.core.frame.DataFrame

In [4]: type(df.loc[1])
Out[4]: pandas.core.series.Series

উত্তর:


107

অনুমোদিত যে আচরণটি বেমানান, তবে আমি মনে করি এটি যেখানে সুবিধাজনক সে ক্ষেত্রে কল্পনা করা সহজ। যাইহোক, প্রতিবার একটি ডেটা ফ্রেম পেতে, কেবল একটি তালিকা পাস করুন loc। অন্যান্য উপায় আছে, তবে আমার মতে এটিই সবচেয়ে পরিষ্কার।

In [2]: type(df.loc[[3]])
Out[2]: pandas.core.frame.DataFrame

In [3]: type(df.loc[[1]])
Out[3]: pandas.core.frame.DataFrame

6
ধন্যবাদ লক্ষণীয় যে লেবেল সূচীতে না থাকলেও এটি একটি ডেটা ফ্রেম প্রদান করে।
চাকরিজীবীরা

7
এফওয়াইআই, একটি অনুলিপি সূচক, এবং একটি একক সূচক (যেমন একটি একক লেবেল) সহ, আপনি সবসময় কোনও সিরিজ ফিরে পাবেন, কেবলমাত্র এটির কারণ সূচীতে ডুপ্লিকেট রয়েছে যে এটি একটি ডেটা ফ্রেম।
জেফ

4
মনে রাখবেন যে আরও একটি গোটচা রয়েছে: যদি প্রস্তাবিত ওয়ার্কআরউন্ড ব্যবহার করা হয় এবং কোনও সাদৃশ্য সারি না থাকে, ফলাফলটি একটি একক সারির সাথে ডেটাফ্রেম হবে, সমস্ত এনএএন।
পল ওয়েস্টার

4
পল, আপনি পান্ডার কোন সংস্করণ ব্যবহার করছেন? সর্বশেষতম সংস্করণে, KeyErrorআমি চেষ্টা করার পরে একটি পেয়েছি .loc[[nonexistent_label]]
ড্যান অ্যালান

4
তালিকাটি ব্যবহার না .locকরা ছাড়া ধীর is এখনও পঠনযোগ্য হতে পারে তবে আরও দ্রুত, আরও ভাল ব্যবহারdf.loc[1:1]
জোনাথন

16

আপনার কাছে তিনটি সূচী আইটেম সহ একটি সূচক রয়েছে 3। এই কারণে df.loc[3]একটি ডেটা ফ্রেম ফিরিয়ে দেবে।

কারণটি হ'ল আপনি কলামটি নির্দিষ্ট করে নি। সুতরাং df.loc[3]সমস্ত কলামের তিনটি আইটেম নির্বাচন করুন (যা কলাম 0), যখন df.loc[3,0]একটি সিরিজ ফেরত দেবে। যেমন df.loc[1:2]একটি ডেটা ফ্রেমও ফেরত দেয়, কারণ আপনি সারিগুলি টুকরো টুকরো করেন।

একটি একক সারি নির্বাচন করা (যেমন df.loc[1]) সূচি হিসাবে কলামের নাম সহ একটি সিরিজ দেয় returns

আপনি যদি সর্বদা ডেটাফ্র্যামের বিষয়ে নিশ্চিত হতে চান তবে আপনি এর মতো স্লাইস করতে পারেন df.loc[1:1]। আরেকটি বিকল্প হ'ল বুলিয়ান ইনডেক্সিং ( df.loc[df.index==1]) বা টেক মেথড ( df.take([0])তবে এই ব্যবহৃত অবস্থানটি লেবেল নয়!)।


4
আচরণটি আমি প্রত্যাশা করব ts আমি একক সারিগুলিকে একটি সিরিজে রূপান্তরিত করার জন্য ডিজাইনের সিদ্ধান্তটি বুঝতে পারি না - কেন একটি সারি সহ কোনও ডেটা ফ্রেম নয়?
চাকরিজীবীরা

আহ, কেন একটি একক সারি নির্বাচন করে একটি সিরিজ দেয়, আমি জানি না।
জরিস

7

df['columnName']একটি সিরিজ পেতে এবং df[['columnName']]একটি ডেটাফ্রেম পেতে ব্যবহার করুন ।


4
আসল df এর একটি অনুলিপি গ্রহণ করুন
smci

6

টিএলডিআর

ব্যবহার করার সময় loc

df.loc[:]= ডেটাফ্রেম

df.loc[int]= আপনার যদি একাধিক কলাম এবং ডেটা ফ্রেমে সিরিজ থাকে তবে ডেটাফ্রেমে আপনার 1 টি কলাম রয়েছে

df.loc[:, ["col_name"]]= ডেটাফ্রেম

df.loc[:, "col_name"]= সিরিজ

ব্যবহার করা হচ্ছে না loc

df["col_name"]= সিরিজ

df[["col_name"]]= ডেটাফ্রেম


3

আপনি জরিসের উত্তরে একটি মন্তব্যে লিখেছেন:

"আমি একক সারিগুলিকে একটি সিরিজে রূপান্তরিত করার জন্য ডিজাইনের সিদ্ধান্তটি বুঝতে পারি না - কেন একটি সারিযুক্ত একটি ডেটা ফ্রেম নয়?"

একটি একক সারি একটি সিরিজে রূপান্তরিত হয় না ।
এটা তোলে IS সিরিজ:No, I don't think so, in fact; see the edit

পান্ডাস ডেটা স্ট্রাকচারগুলি সম্পর্কে ভাবার সেরা উপায় হ'ল নিম্ন মাত্রিক তথ্যের জন্য নমনীয় পাত্রে। উদাহরণস্বরূপ, ডেটাফ্রেম সিরিজের জন্য একটি ধারক এবং প্যানেল ডেটা ফ্রেম অবজেক্টের জন্য একটি ধারক। আমরা অভিধানের মতো ফ্যাশনে এই ধারকগুলি থেকে অবজেক্টগুলি সন্নিবেশ করতে এবং সরাতে সক্ষম হতে চাই।

http://pandas.pydata.org/pandas-docs/stable/overview.html#why-more-than-1-data-st संरचना

পান্ডাস অবজেক্টের ডেটা মডেলটি সেভাবেই বেছে নেওয়া হয়েছে। কারণটি অবশ্যই এতে নিহিত রয়েছে যে এটি আমার জানা না থাকা কিছু সুবিধা নিশ্চিত করে (আমি উদ্ধৃতিটির শেষ বাক্যটি পুরোপুরি বুঝতে পারি না, সম্ভবত এটি কারণ)

সম্পাদনা: আমি আমার সাথে একমত নই

একজন DataFrame উপাদান আছে যা হবে গঠিত করা যাবে না হতে , সিরিজ কারণ নিম্নলিখিত কোড একই ধরনের "সিরিজ" পাশাপাশি একটি কলামের জন্য যেমন একটি সারিতে দেয়:

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'>

সুতরাং, কোনও ডেটাফ্রেম সিরিজটি নিয়ে গঠিত বলে ভেবে দেখার কোনও বুদ্ধি নেই কারণ এগুলি বলেছিল সিরিজটি কী হবে: কলাম বা সারি? বোকা প্রশ্ন এবং দৃষ্টি।

তাহলে ডেটাফ্রেম কী?

এই উত্তরের পূর্ববর্তী সংস্করণে, আমি এই প্রশ্নটি 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?অংশটির উত্তর ড্যান অ্যালান দিয়েছেন।

তারপরে, পান্ডাদের ডকুমেন্টগুলি উপরে বর্ণিত হয়েছে যে পান্ডাদের ডেটা স্ট্রাকচারগুলি নিম্ন মাত্রিক উপাত্তের ধারক হিসাবে সবচেয়ে ভালভাবে দেখা যায় , এটি আমার কাছে মনে হয়েছিল যে কেন ডেটাফ্রেম কাঠামোর প্রকৃতির চরিত্রগতগুলিতে এই বিষয়টি বোঝা যাবে।

তবে, আমি বুঝতে পেরেছি যে এই উদ্ধৃত পরামর্শটি পান্ডাদের ডেটা স্ট্রাকচারের প্রকৃতির একটি সুনির্দিষ্ট বিবরণ হিসাবে গ্রহণ করা উচিত নয়।
এই পরামর্শের অর্থ এই নয় যে কোনও ডেটাফ্রেম সিরিজের ধারক।
এটি প্রকাশ করে যে সিরিজের একটি ধারক হিসাবে ডেটাফ্রেমের মানসিক উপস্থাপনা (যুক্তির এক মুহুর্তে বিবেচনা করা বিকল্প অনুসারে সারি বা কলামগুলি হয়) ডাটাফ্রেমগুলি বিবেচনা করার একটি ভাল উপায়, এমনকি বাস্তবে এটি দৃ strictly়রূপে ঘটেনি। "ভাল" অর্থ এই দৃষ্টিভঙ্গি দক্ষতার সাথে ডেটা ফ্রেমগুলি ব্যবহার করতে সক্ষম করে। এখানেই শেষ.

তাহলে ডেটাফ্রেম অবজেক্টটি কী?

DataFrame বর্গ দৃষ্টান্ত আছে একটি নির্দিষ্ট কাঠামো সম্ভূত উৎপন্ন NDFrame বেস বর্গ, নিজেই থেকে উদ্ভূত PandasContainer বেস বর্গ এছাড়াও একটি পিতা বা মাতা ক্লাস হয় যে সিরিজ বর্গ।
নোট করুন যে সংস্করণ 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'>,)

সুতরাং আমার বুঝতে এখন যে কোনও ডাটাফ্রেমের উদাহরণে সুনির্দিষ্ট কিছু পদ্ধতি রয়েছে যা সারি এবং কলামগুলি থেকে ডেটা উত্তোলনের পথে নিয়ন্ত্রণের জন্য তৈরি করা হয়েছিল cra

এই নিষ্কাশন পদ্ধতিগুলি কীভাবে কাজ করে সেগুলি এই পৃষ্ঠায় বর্ণিত হয়েছে: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing
আমরা এটিতে ড্যান অ্যালান এবং অন্যান্য পদ্ধতি দ্বারা প্রদত্ত পদ্ধতিটি পাই।

কেন এই নিষ্কাশন পদ্ধতিগুলি যেমন ছিল তেমন তৈরি করা হয়েছিল?
এটি অবশ্যই কারণ ডেটা বিশ্লেষণে আরও ভাল সম্ভাবনা এবং স্বাচ্ছন্দ্য প্রদানকারী হিসাবে তাদের মূল্যায়ন করা হয়েছে।
এই বাক্যটিতে যা প্রকাশ করা হয়েছে তা অবিকল:

পান্ডাস ডেটা স্ট্রাকচারগুলি সম্পর্কে ভাবার সেরা উপায় হ'ল নিম্ন মাত্রিক তথ্যের জন্য নমনীয় পাত্রে।

কেন একটি DataFRame উদাহরণস্বরূপ থেকে তথ্য আহরণ করে না তার কাঠামো মিথ্যা, এটা এই ব্যবস্থার সবচেয়ে গুরত্বপূর্ণ কেন এই কাঠামো। আমি অনুমান করি যে পান্ডাদের ডেটা স্ট্রাকচারের গঠন এবং কার্যকারিতাটি যতটা সম্ভব বৌদ্ধিকভাবে স্বজ্ঞাত হওয়ার জন্য ছাঁটাই করা হয়েছে এবং বিশদটি বোঝার জন্য ওয়েস ম্যাককিনির ব্লগটি অবশ্যই পড়তে হবে।


4
এফওয়াইআই, ডেটাফ্রেম কোনও নাদারের উপ-শ্রেণি নয়, কোনও সিরিজও নয় (0.13 থেকে শুরু হওয়া আগে এটি আগে ছিল)। এগুলি হ'ল ডিকের মতো কিছু।
জেফ

আমাকে অবহিত করার জন্য আপনাকে ধন্যবাদ। আমি সত্যই প্রশংসা করি কারণ পান্ডস শেখার ক্ষেত্রে আমি নতুন। তবে ভালভাবে বুঝতে আমার আরও তথ্য দরকার। ডক্সে কেন এটি লেখা হয় যে একটি সিরিজটি নাদারেরের একটি সাবক্লাস?
আইকেম

এটি 0.13 এর আগে ছিল (শীঘ্রই প্রকাশ হবে), এখানে দেব ডক্স রয়েছে: pandas.pydata.org/pandas-docs/dev/dsintro.html#series
জেফ

ঠিক আছে. আপনাকে অনেক ধন্যবাদ. তবে এটি আমার যুক্তি এবং বোঝার ভিত্তিকে পরিবর্তন করে না, তাই না? - 0.13 এর নিকৃষ্টতম পান্ডায়, ডেটাফ্রেম এবং অন্যান্য পান্ডার বিষয়গুলি সিরিজ থেকে আলাদা: সেগুলি কি সাবক্লাসের?
আইকোম

@ জেফ আপনাকে ধন্যবাদ। আপনার তথ্যের পরে আমি আমার উত্তরটি পরিবর্তন করেছি। আপনি আমার সম্পাদনা সম্পর্কে কী ভাবেন তা জানতে পেরে আমি সন্তুষ্ট হব।
eyquem

1

উদ্দেশ্যটি যদি সূচকটি ব্যবহার করে ডেটা সেটের উপসেট পেতে হয় তবে এটি ব্যবহার করা locবা এড়ানো ভাল iloc। পরিবর্তে আপনি এর অনুরূপ সিনট্যাক্স ব্যবহার করা উচিত:

df = pd.DataFrame(data=range(5), index=[1, 2, 3, 3, 3])
result = df[df.index == 3] 
isinstance(result, pd.DataFrame) # True

result = df[df.index == 1]
isinstance(result, pd.DataFrame) # True

0

আপনি যদি ডেটাফ্রেমের সূচকেও নির্বাচন করেন তবে ফলাফলটি ডেটাফ্রেম বা একটি সিরিজ হতে পারে বা এটি সিরিজ বা একটি স্কেলার (একক মান) হতে পারে।

এই ফাংশনটি নিশ্চিত করে যে আপনি সর্বদা আপনার নির্বাচন থেকে একটি তালিকা পান (যদি ডিএফ, সূচক এবং কলামটি বৈধ হয়):

def get_list_from_df_column(df, index, column):
    df_or_series = df.loc[index,[column]] 
    # df.loc[index,column] is also possible and returns a series or a scalar
    if isinstance(df_or_series, pd.Series):
        resulting_list = df_or_series.tolist() #get list from series
    else:
        resulting_list = df_or_series[column].tolist() 
        # use the column key to get a series from the dataframe
    return(resulting_list)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.