পান্ডাস ডেটা ফ্রেম এবং গণনায় নির্বাচিত কলামগুলিতে মানগুলির অনন্য সংমিশ্রণ


109

পান্ডাস ডেটা ফ্রেমে আমার ডেটা নীচে রয়েছে:

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

তবে, দেখা যাচ্ছে যে এই জাতীয় সংমিশ্রণগুলি একটি কলামে রয়েছে। আমি প্রতিটি মানকে একটি সংমিশ্রণকে আলাদা কলামে আলাদা করতে এবং গণনার ফলাফলের জন্য আরও একটি কলাম যুক্ত করতে চাই। ওটা করা কি সম্ভব? আমি কি আপনার পরামর্শ নিতে পারি? তুমাকে অগ্রিম ধন্যবাদ.

উত্তর:


176

আপনি 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

হালনাগাদ

একটি সামান্য ব্যাখ্যা, ২ টি কলামে দলবদ্ধ করে এই গোষ্ঠীগুলিকে সারি যেখানে 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()নির্দিষ্ট কলামের কলামের সাথে একসাথে সারিগুলিকে গোষ্ঠীকরণের জন্য ব্যবহার করার চেষ্টা চালিয়েছি । আশ্চর্যজনক, আপনাকে ধন্যবাদ!
ব্যবহারকারী 3290553

0

@ এডচমের খুব সুন্দর উত্তর কোনও ফাংশনে রেখে দেওয়া 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']]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.