কী দ্বারা কীভাবে প্যান্ডাসের গোষ্ঠীভিত্তিক ডেটা ফ্রেমে অ্যাক্সেস করবেন


154

কী দ্বারা কীভাবে আমি একটি গ্রুপবাই অবজেক্টে সম্পর্কিত গ্রুপবাই ডেটাফ্রেমে অ্যাক্সেস করব?

নিম্নলিখিত গ্রুপবাইয়ের সাথে:

rand = np.random.RandomState(1)
df = pd.DataFrame({'A': ['foo', 'bar'] * 3,
                   'B': rand.randn(6),
                   'C': rand.randint(0, 20, 6)})
gb = df.groupby(['A'])

কীগুলি এবং গোষ্ঠীগুলি পেতে আমি এর মাধ্যমে পুনরাবৃত্তি করতে পারি:

In [11]: for k, gp in gb:
             print 'key=' + str(k)
             print gp
key=bar
     A         B   C
1  bar -0.611756  18
3  bar -1.072969  10
5  bar -2.301539  18
key=foo
     A         B   C
0  foo  1.624345   5
2  foo -0.528172  11
4  foo  0.865408  14

আমি একটি গ্রুপ এর কী দ্বারা অ্যাক্সেস করতে সক্ষম হতে চাই:

In [12]: gb['foo']
Out[12]:  
     A         B   C
0  foo  1.624345   5
2  foo -0.528172  11
4  foo  0.865408  14

তবে আমি যখন এটি করার চেষ্টা করি তখন আমি gb[('foo',)]এই অদ্ভুত pandas.core.groupby.DataFrameGroupByঅবজেক্টটি পাই যা কোনও চাই যে ডেটা ফ্রেমের সাথে আমার সাদৃশ্যপূর্ণ কোনও পদ্ধতি রয়েছে বলে মনে হয় না।

আমি সবচেয়ে ভাল চিন্তা করতে পারি:

In [13]: def gb_df_key(gb, key, orig_df):
             ix = gb.indices[key]
             return orig_df.ix[ix]

         gb_df_key(gb, 'foo', df)
Out[13]:
     A         B   C
0  foo  1.624345   5
2  foo -0.528172  11
4  foo  0.865408  14  

তবে এই একধরণের বাজে বিষয় বিবেচনা করে সাধারণত এই জিনিসগুলিতে কতটা সুন্দর পান্ডা হয়।
এটি করার অন্তর্নির্মিত উপায় কী?

উত্তর:


192

আপনি get_groupপদ্ধতিটি ব্যবহার করতে পারেন :

In [21]: gb.get_group('foo')
Out[21]: 
     A         B   C
0  foo  1.624345   5
2  foo -0.528172  11
4  foo  0.865408  14

দ্রষ্টব্য: এর জন্য প্রতিটি দলের জন্য মধ্যবর্তী অভিধান / প্রতি উপডাফ্রেমের অনুলিপি তৈরি করার প্রয়োজন নেই, তাই মেকি অভিধানটি তৈরি করার ফলে আরও অনেক স্মৃতি-দক্ষ হবে dict(iter(gb))। এর কারণ এটি গ্রুপবাই অবজেক্টে ইতিমধ্যে উপলব্ধ ডেটা-কাঠামো ব্যবহার করে।


আপনি গ্রুপবিহীন কাটা ব্যবহার করে বিভিন্ন কলাম নির্বাচন করতে পারেন:

In [22]: gb[["A", "B"]].get_group("foo")
Out[22]:
     A         B
0  foo  1.624345
2  foo -0.528172
4  foo  0.865408

In [23]: gb["C"].get_group("foo")
Out[23]:
0     5
2    11
4    14
Name: C, dtype: int64

72

ডেটা অ্যানালাইসিসের পাইথনের ওয়েস ম্যাককিনি (পান্ডাসের লেখক) নিম্নলিখিত রেসিপিটি সরবরাহ করেছেন:

groups = dict(list(gb))

যা এমন একটি অভিধান প্রদান করে যার কীগুলি আপনার গ্রুপ লেবেল এবং যার মান হ'ল ডেটা ফ্রেম ie

groups['foo']

আপনি যা সন্ধান করছেন তা ফল দেবে:

     A         B   C
0  foo  1.624345   5
2  foo -0.528172  11
4  foo  0.865408  14

1
আপনাকে ধন্যবাদ, এটি খুব দরকারী। আমি groups = dict(list(gb))কেবল স্টোর কলাম তৈরি করতে কোডটি কীভাবে সংশোধন করতে পারি C? ধরা যাক আমি অন্যান্য কলামগুলিতে আগ্রহী না এবং সেগুলি সঞ্চয় করতে চাই না।
ঝুবার্ব

5
উত্তর:dict(list( df.groupby(['A'])['C'] ))
ঝুবার্ব

4
দ্রষ্টব্য: এটি ব্যবহারের জন্য আরও দক্ষ (তবে সমমানের) dict(iter(g))। (যদিও get_groupএটি সর্বোত্তম উপায় / কারণ এটি অভিধান তৈরি করার সাথে জড়িত না / আপনাকে পান্ডায় রাখে!: ডি)
অ্যান্ডি হেডেন

আমি গ্রুপগুলি (ডিক্ট (তালিকা (জিবি)) ব্যবহার করতে পারিনি তবে আপনি নিম্নলিখিত পদ্ধতিতে একটি অভিধান তৈরি করতে পারেন: gb_dict = {str(indx): str(val) for indx in gb.indx for val in gb.some_key}এবং তারপরে মানটি পুনরুদ্ধার করুনgb_dict[some_key]
ইউজার 2476665

শুধু ব্যবহার করুন get_group(), এই রেসিপিটি বছরের পর বছর ধরে প্রয়োজন হয়নি।
smci

20

বরং

gb.get_group('foo')

আমি ব্যবহার পছন্দ করি gb.groups

df.loc[gb.groups['foo']]

কারণ এইভাবে আপনি একাধিক কলামও চয়ন করতে পারেন। উদাহরণ স্বরূপ:

df.loc[gb.groups['foo'],('A','B')]

4
দ্রষ্টব্য: আপনি ব্যবহার করে বিভিন্ন কলাম নির্বাচন করতে পারেন gb[["A", "B"]].get_group("foo")
অ্যান্ডি হেডেন

6
gb = df.groupby(['A'])

gb_groups = grouped_df.groups

যদি আপনি তখন বাছাইকৃত গ্রুপবাই অবজেক্টের সন্ধান করেন তবে, করুন: gb_groups.keys (), এবং নিম্নলিখিত কী_লিস্টে কাঙ্ক্ষিত কী ইনপুট করুন ..

gb_groups.keys()

key_list = [key1, key2, key3 and so on...]

for key, values in gb_groups.iteritems():
    if key in key_list:
        print df.ix[values], "\n"

1

আমি গ্রুপবাইয়ের আপত্তি অনুসারে কয়েকজন সদস্যকে নমুনা দেওয়ার একটি উপায় খুঁজছিলাম - এটি করার জন্য পোস্ট করা প্রশ্নের সমাধান করতে হয়েছিল।

গ্রুপবাই অবজেক্ট তৈরি করুন

grouped = df.groupby('some_key')

এন ডেটাফ্রেমগুলি বেছে নিন এবং তাদের সূচকগুলি ধরুন

sampled_df_i  = random.sample(grouped.indicies, N)

গ্রুপ দখল

df_list  = map(lambda df_i: grouped.get_group(df_i), sampled_df_i)

allyচ্ছিকভাবে - এগুলি আবার একক ডেটাফ্রেম অবজেক্টে পরিণত করুন

sampled_df = pd.concat(df_list, axis=0, join='outer')

1
এটি কাজ করে না:sampled_df_i = random.sample(grouped.indicies, N)
আয়রিন

@irene - আপনি কি আরও দীর্ঘ উদাহরণ / আরও প্রসঙ্গে একটি লিঙ্ক সরবরাহ করতে পারেন?
মায়ারসন

আমি নিম্নলিখিত ত্রুটি পেয়েছি:AttributeError: 'DataFrameGroupBy' object has no attribute 'indicies'
আয়রিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.