पांडा समूह डेटाबीम को कुंजी द्वारा कैसे एक्सेस करें


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वस्तु मिल जाती है, जो मुझे लगता है कि DataFrame के अनुरूप कोई भी तरीका नहीं है।

सबसे अच्छा मैं सोच सकता है:

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

जो एक शब्दकोश देता है जिसकी कुंजी आपके समूह लेबल हैं और जिनके मान DataFrames हैं, अर्थात

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? मान लीजिए कि मुझे दूसरे कॉलम में कोई दिलचस्पी नहीं है और इसलिए मैं उन्हें स्टोर नहीं करना चाहता।
Zhubarb

5
उत्तर:dict(list( df.groupby(['A'])['C'] ))
ज़ुर्बर्ब

4
नोट: यह उपयोग करने के लिए अधिक कुशल (लेकिन समतुल्य) है dict(iter(g))। (हालांकि get_groupयह सबसे अच्छा तरीका है / क्योंकि इसमें एक शब्दकोश बनाना शामिल नहीं है / आपको पंडों में रखता है !: D)
एंडी हेडन

मैं समूहों का उपयोग करने में सक्षम नहीं था (तानाशाह (सूची (gb))) लेकिन आप निम्नलिखित तरीके से एक शब्दकोश बना सकते हैं: gb_dict = {str(indx): str(val) for indx in gb.indx for val in gb.some_key}और फिर के माध्यम से मान पुनः प्राप्त करेंgb_dict[some_key]
user2476665

बस उपयोग करें get_group(), यह नुस्खा वर्षों से आवश्यक नहीं है।
23

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 (), और इनपुट को निम्नलिखित key_list में वांछित कुंजी दें।

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

मैं GroupBy obj के कुछ सदस्यों के नमूने के लिए एक रास्ता खोज रहा था - इसे पूरा करने के लिए पोस्ट किए गए प्रश्न को संबोधित करना था।

समूह वस्तु बनाएँ

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)

वैकल्पिक रूप से - इसे वापस एक ही डेटाफ्रेम ऑब्जेक्ट में बदल दें

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

1
यह काम नहीं करता है:sampled_df_i = random.sample(grouped.indicies, N)
irene

@irene - क्या आप एक लंबे उदाहरण / अधिक संदर्भ के लिए एक लिंक प्रदान कर सकते हैं?
मेयेरसन

मुझे निम्नलिखित त्रुटि मिलती है:AttributeError: 'DataFrameGroupBy' object has no attribute 'indicies'
आइरन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.