पांडा डेटा फ्रेम और गिनती में चयनित स्तंभों में मूल्यों का अनूठा संयोजन


108

मेरे पास पांडा डेटा फ्रेम में मेरा डेटा इस प्रकार है:

df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],
                   'B':['yes','no','no','no','yes','yes','no','yes','yes','no']})

तो, मेरा डेटा इस तरह दिखता है

----------------------------
index         A        B
0           yes      yes
1           yes       no
2           yes       no
3           yes       no
4            no      yes
5            no      yes
6           yes       no
7           yes      yes
8           yes      yes
9            no       no
-----------------------------

मैं इसे दूसरे डेटा फ्रेम में बदलना चाहूंगा। अपेक्षित आउटपुट निम्न पायथन लिपि में दिखाया जा सकता है:

output = pd.DataFrame({'A':['no','no','yes','yes'],'B':['no','yes','no','yes'],'count':[1,2,4,3]})

इसलिए, मेरा अपेक्षित आउटपुट इस तरह दिखता है

--------------------------------------------
index      A       B       count
--------------------------------------------
0         no       no        1
1         no      yes        2
2        yes       no        4
3        yes      yes        3
--------------------------------------------

वास्तव में, मैं निम्नलिखित आदेशों का उपयोग करके सभी संयोजनों को खोजने और उन्हें गिनने के लिए प्राप्त कर सकता हूं: mytable = df1.groupby(['A','B']).size()

हालांकि, यह पता चला है कि ऐसे संयोजन एक ही कॉलम में हैं। मैं संयोजन में प्रत्येक मान को अलग-अलग कॉलम में अलग करना चाहूंगा और गिनती के परिणाम के लिए एक और कॉलम भी जोड़ूंगा। क्या यह करना मुमकिन है? क्या मुझे आपके सुझाव मिल सकते हैं? पहले ही, आपका बहुत धन्यवाद।

जवाबों:


174

आप groupby'ए ’और' बी’ पर कॉल कर सकते हैं sizeऔर कॉल कर सकते हैं और फिर reset_indexऔर renameउत्पन्न कॉलम:

In [26]:

df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})
Out[26]:
     A    B  count
0   no   no      1
1   no  yes      2
2  yes   no      4
3  yes  yes      3

अपडेट करें

2 स्तंभों पर समूहीकरण करके, यह समूह पंक्तियाँ जहाँ A और B मान समान हैं, हम कॉल करते हैं sizeजो अद्वितीय समूहों की संख्या लौटाता है:

In[202]:
df1.groupby(['A','B']).size()

Out[202]: 
A    B  
no   no     1
     yes    2
yes  no     4
     yes    3
dtype: int64

इसलिए अब समूहीकृत कॉलम को पुनर्स्थापित करने के लिए, हम कॉल करते हैं reset_index:

In[203]:
df1.groupby(['A','B']).size().reset_index()

Out[203]: 
     A    B  0
0   no   no  1
1   no  yes  2
2  yes   no  4
3  yes  yes  3

यह सूचकांकों को पुनर्स्थापित करता है लेकिन आकार एकत्रीकरण एक उत्पन्न कॉलम में बदल जाता है 0, इसलिए हमें इसका नाम बदलना होगा:

In[204]:
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})

Out[204]: 
     A    B  count
0   no   no      1
1   no  yes      2
2  yes   no      4
3  yes  yes      3

groupbyas_indexहम उस अर्ग को स्वीकार करते हैं, जिसे हम सेट कर सकते थे, Falseइसलिए यह समूहीकृत कॉलम को इंडेक्स नहीं बनाता है, लेकिन यह एक उत्पन्न करता है seriesऔर आपको अभी भी सूचकांकों को पुनर्स्थापित करना होगा और इसी तरह ....:

In[205]:
df1.groupby(['A','B'], as_index=False).size()

Out[205]: 
A    B  
no   no     1
     yes    2
yes  no     4
     yes    3
dtype: int64

2

थोड़ा संबंधित, मैं अद्वितीय संयोजनों की तलाश में था और मैं इस विधि के साथ आया:

def unique_columns(df,columns):

    result = pd.Series(index = df.index)

    groups = meta_data_csv.groupby(by = columns)
    for name,group in groups:
       is_unique = len(group) == 1
       result.loc[group.index] = is_unique

    assert not result.isnull().any()

    return result

और यदि आप केवल यह दावा करना चाहते हैं कि सभी संयोजन अद्वितीय हैं:

df1.set_index(['A','B']).index.is_unique

के बारे में नहीं पता था set_index()groupby()स्तंभों की एक विशेष आम जोड़ी के साथ पंक्तियों को एक साथ समूहीकृत करने के लिए उपयोग करने की कोशिश कर रहा । कमाल है, धन्यवाद!
user3290553

0

एक समारोह में @ EdChum का बहुत अच्छा जवाब देना count_unique_index। अद्वितीय विधि केवल पांडा श्रृंखला पर काम करती है, डेटा फ़्रेम पर नहीं। नीचे फ़ंक्शन आर में अद्वितीय फ़ंक्शन के व्यवहार को पुन: पेश करता है :

अद्वितीय रिटर्न एक वेक्टर, डेटा फ्रेम या एक्स की तरह सरणी लेकिन डुप्लिकेट तत्वों / पंक्तियों के साथ हटा दिया।

और ओपी द्वारा अनुरोधित घटनाओं की एक संख्या जोड़ता है।

df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],                                                                                             
                    'B':['yes','no','no','no','yes','yes','no','yes','yes','no']})                                                                                               
def count_unique_index(df, by):                                                                                                                                                 
    return df.groupby(by).size().reset_index().rename(columns={0:'count'})                                                                                                      

count_unique_index(df1, ['A','B'])                                                                                                                                              
     A    B  count                                                                                                                                                                  
0   no   no      1                                                                                                                                                                  
1   no  yes      2                                                                                                                                                                  
2  yes   no      4                                                                                                                                                                  
3  yes  yes      3

0

मैं इस के साथ समय परीक्षण नहीं किया है, लेकिन यह कोशिश करने के लिए मजेदार था। मूल रूप से दो स्तंभों को ट्यूपल्स के एक कॉलम में परिवर्तित करें। अब परिवर्तित कि एक dataframe करने के लिए, ऐसा जो अद्वितीय तत्व पाता है 'value_counts ()' और उन्हें गिना जाता है। फिर से ज़िप के साथ फ़ेल्ड करें और कॉलम को क्रम में रखें जो आप चाहते हैं। आप शायद कदमों को और अधिक सुंदर बना सकते हैं लेकिन ट्यूल के साथ काम करना इस समस्या के लिए मेरे लिए अधिक स्वाभाविक लगता है

b = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],'B':['yes','no','no','no','yes','yes','no','yes','yes','no']})

b['count'] = pd.Series(zip(*[b.A,b.B]))
df = pd.DataFrame(b['count'].value_counts().reset_index())
df['A'], df['B'] = zip(*df['index'])
df = df.drop(columns='index')[['A','B','count']]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.