পান্ডাস গণনা (স্বতন্ত্র) সমতুল্য


288

আমার একাধিক ডাটাবেস (ওরাকল, এমএসকিএল, ইত্যাদি) থাকায় আমি পান্ডাকে ডিবি বিকল্প হিসাবে ব্যবহার করছি এবং আমি এসকিউএল সমতুল্য কমান্ডের ক্রম তৈরি করতে অক্ষম।

আমার কাছে কিছু কলাম সহ ডেটা ফ্রেমে একটি টেবিল লোড হয়েছে:

YEARMONTH, CLIENTCODE, SIZE, .... etc etc

এসকিউএলে, প্রতি বছর বিভিন্ন ক্লায়েন্টের পরিমাণ গণনা করা হবে:

SELECT count(distinct CLIENTCODE) FROM table GROUP BY YEARMONTH;

এবং ফলাফল হবে

201301    5000
201302    13245

পান্ডাতে আমি কীভাবে এটি করতে পারি?


আমি টেবিল.groupby (['YEARMONTH']) ['ক্লায়েন্টকোড']। অনন্য () করেছি এবং YEARMONTH দ্বারা ইনডেক্স করা দুটি সিরিজ এবং সমস্ত অনন্য মান সহ এসেছি। কিভাবে প্রতিটি সিরিজের মান পরিমাণ গণনা?
অ্যাড্রিয়ানো আলমেইদা

কারও কারও কাছে, value_countsআপনি যে উত্তরটি খুঁজছেন তা হতে পারে: pandas.pydata.org/pandas-docs/stable/generated/…
সাচিনরুক

উত্তর:


434

আমি বিশ্বাস করি এটিই আপনি চান:

table.groupby('YEARMONTH').CLIENTCODE.nunique()

উদাহরণ:

In [2]: table
Out[2]: 
   CLIENTCODE  YEARMONTH
0           1     201301
1           1     201301
2           2     201301
3           1     201302
4           2     201302
5           2     201302
6           3     201302

In [3]: table.groupby('YEARMONTH').CLIENTCODE.nunique()
Out[3]: 
YEARMONTH
201301       2
201302       3

2
আমার যদি একাধিক কলাম রয়েছে যা আমি একসাথে অনন্য হতে চাই, যেমন .pd_ নকল (সাবসেট = ['কল 1', 'কল 2']) এর মতো?
আর্নেস্টস্বেবলার

4
এই অনন্য গণনাটি কীভাবে অ্যাক্সেস করবেন। যেহেতু কোনও কলামের নাম নেই
তরুণ খানেজা

অনেক ধন্যবাদ, আমি এই স্টাইলটি পুনরায় নমুনার আউটপুটটিতে ব্যবহার করেছি। df_watch_record.resample ('M')। user.nunique () প্রতিমাসে মুভি দেখেছেন এমন অনন্য ব্যবহারকারীর সংখ্যা গণনা করে।
মেহেদী কাজেমি

1
।। এবং তাদের table.groupby ( 'YEARMONTH') দিয়ে সাজানোর CLIENTCODE.nunique () sort_values (আরোহী মিথ্যা =)
wllbll

এর পরে গ্রুপ সনাক্তকারী পুনরুদ্ধার করা সম্ভব nunique? হিসাবে আমি আমি একটি উপায় খুঁজে পাচ্ছি না পারে যেহেতু এই উত্তর এর ফলে হয় ব্যবহার করে দেখুন Seriesএকটি না DataFrame
জোশ হানসেন

92

এখানে আরও একটি সহজ পদ্ধতি, খুব সহজ, যাক আপনার ডেটাফ্রেমের নাম daatএবং কলামের নামটি বলতে দিনYEARMONTH

daat.YEARMONTH.value_counts()

1
আমি এই উত্তর পছন্দ। আমার কলামের নামটিতে একটি থাকলে আমি কীভাবে এই পদ্ধতিটি ব্যবহার করতে পারি। এটিতে (যেমন 'ck.Class')? ধন্যবাদ

5
দ্যাট ['ck.Class']। মান_কাউন্ট ()
স্ট্যাটগুয়েসার

27
এটি জিজ্ঞাসিত প্রশ্নের সমাধান করে না।
অ্যারন শুমাচর

6
এটি প্রতিটি গ্রুপের মধ্যে পর্যবেক্ষণের সংখ্যা গণনা করছে, প্রতিটি গ্রুপের একটি নির্দিষ্ট কলামের অনন্য মান নয়।
জেসন গোল

2
এটি ভুল উত্তর; এটি DISTINCTপ্রশ্ন থেকে প্রয়োজন প্রতিফলিত করে না ! তদুপরি, এটি গণনা অন্তর্ভুক্ত না NaN!
কোরি লেভিনসন

47

আকর্ষণীয়ভাবে যথেষ্ট, খুব প্রায়ই len(unique())কয়েক বার (3x-15x) এর চেয়ে দ্রুত হয় nunique()


11
তুমি এটা বুজাচ্ছো? .CLIENTCODE.apply(lambda x: len(x.unique())), থেকে এখানে
user4015990

6
@ user32185 আপনাকে এটিকে applyএকটি ল্যাম্বডা সহ একটি কলটিতে ফেলে দিতে হবে । উদাহরণস্বরূপ df.groupby('YEARMONTH')['CLIENTCODE'].apply(lambda x: x.unique().shape[0]),।
3novak

3
সিনট্যাক্স পুরোপুরি পরিষ্কার নয়, আমি len(df['column'].unique())ল্যাম্বডা ফাংশনের প্রয়োজন নেই
mlh351

আমি মন্তব্য TypeError: object of type 'method' has no len()থেকে পেয়েছি Chen's, 3novak'sআমার জন্য কাজ।
জেসন গোল

4

ব্যবহার করে crosstab, এটি এর চেয়ে আরও বেশি তথ্য ফিরে আসবেgroupby nunique

pd.crosstab(df.YEARMONTH,df.CLIENTCODE)
Out[196]: 
CLIENTCODE  1  2  3
YEARMONTH          
201301      2  1  0
201302      1  2  1

কিছুটা সংশোধন করার পরে ফলাফলটি দিন

pd.crosstab(df.YEARMONTH,df.CLIENTCODE).ne(0).sum(1)
Out[197]: 
YEARMONTH
201301    2
201302    3
dtype: int64

আমি কীভাবে এটি দুটি কলাম YEARMONTHএবং রফতানি করতে পারি count। এছাড়াও আমি গণনাটিকে অবতরণ ক্রমে সেট করতে পারি?
মুর্তজা হাজী

3

আমিও ব্যবহার করছি nuniqueতবে আপনি যদি একটি সামগ্রিক ফাংশন 'min', 'max', 'count' or 'mean'ইত্যাদি ব্যবহার করতে চান তবে এটি খুব সহায়ক হবে

df.groupby('YEARMONTH')['CLIENTCODE'].transform('nunique') #count(distinct)
df.groupby('YEARMONTH')['CLIENTCODE'].transform('min')     #min
df.groupby('YEARMONTH')['CLIENTCODE'].transform('max')     #max
df.groupby('YEARMONTH')['CLIENTCODE'].transform('mean')    #average
df.groupby('YEARMONTH')['CLIENTCODE'].transform('count')   #count

0

নতুন পান্ডাস সংস্করণ সহ, ডেটাফ্রেম হিসাবে পাওয়া সহজ

unique_count = pd.groupby(['YEARMONTH'], as_index=False).agg(uniq_CLIENTCODE =('CLIENTCODE',pd.Series.count))

0

এখানে একাধিক কলামের মধ্যে স্বতন্ত্র গণনা করার একটি পদ্ধতির। আসুন কিছু ডেটা আছে:

data = {'CLIENT_CODE':[1,1,2,1,2,2,3],
        'YEAR_MONTH':[201301,201301,201301,201302,201302,201302,201302],
        'PRODUCT_CODE': [100,150,220,400,50,80,100]
       }
table = pd.DataFrame(data)
table

CLIENT_CODE YEAR_MONTH  PRODUCT_CODE
0   1       201301      100
1   1       201301      150
2   2       201301      220
3   1       201302      400
4   2       201302      50
5   2       201302      80
6   3       201302      100

এখন, আগ্রহের কলামগুলি তালিকাভুক্ত করুন এবং সামান্য পরিবর্তিত বাক্য গঠনতে গ্রুপবাই ব্যবহার করুন:

columns = ['YEAR_MONTH', 'PRODUCT_CODE']
table[columns].groupby(table['CLIENT_CODE']).nunique()

আমরা প্রাপ্ত:

YEAR_MONTH  PRODUCT_CODE CLIENT_CODE        
1           2            3
2           2            3
3           1            1

0

অন্যান্য কলামগুলিতে একত্রিত হওয়ার সাথে কলামের পৃথকীকরণ

যে কোনও কলামের ( CLIENTCODEআপনার ক্ষেত্রে) আলাদা আলাদা মান পেতে আমরা ব্যবহার করতে পারি nunique। আমরা aggঅন্যান্য কলামে সমষ্টি সহ ফাংশনটিতে অভিধান হিসাবে ইনপুটটি পাস করতে পারি :

grp_df = df.groupby('YEARMONTH').agg({'CLIENTCODE': ['nunique'],
                                      'other_col_1': ['sum', 'count']})

# to flatten the multi-level columns
grp_df.columns = ["_".join(col).strip() for col in grp_df.columns.values]

# if you wish to reset the index
grp_df.reset_index(inplace=True)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.