একটি ডেটা ফ্রেম কলামে একটি মান যে ফ্রিকোয়েন্সি হয় তা গণনা করুন


311

আমার একটি ডেটাসেট আছে

|category|
cat a
cat b
cat a

আমি এমন কিছু ফেরত দিতে সক্ষম হতে চাই (অনন্য মান এবং ফ্রিকোয়েন্সি দেখায়)

category | freq |
cat a       2
cat b       1


93
আপনি খুঁজছেন df["category"].value_counts()?
ডিএসএম

"ডিএফ [" বিভাগ "] ব্যবহার করার সময়। মান_কাউন্ট ()" এটি কি কোন ইন্ট্রি বলেছে? কিন্তু এটি সূচক হিসাবে কলামের নাম ফেরত দেয়? এটি কোনও ডেটাফ্রেম অবজেক্ট বা এটি কোনওভাবে কোনও সিরিজ (গণনা) এবং আসল অনন্য কলাম মানগুলির সংমিশ্রণ করছে?
yoshiserry

@ ইয়োশিসারি এটি একটি পান্ডাস সিরিজ করছে type(df['category'].value_counts())এবং এটি তাই বলবে
এডচুম

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

উত্তর:


412

ব্যবহার করুন groupbyএবং count:

In [37]:
df = pd.DataFrame({'a':list('abssbab')})
df.groupby('a').count()

Out[37]:

   a
a   
a  2
b  3
s  2

[3 rows x 1 columns]

অনলাইন ডক্স দেখুন: http://pandas.pydata.org/pandas-docs/stable/groupby.html

এছাড়াও value_counts()@DSM মন্তব্য করেছে এখানে একটি বিড়াল ত্বক, অনেক উপায়

In [38]:
df['a'].value_counts()

Out[38]:

b    3
a    2
s    2
dtype: int64

আপনি যদি transformসংযুক্ত সূচকটি ফেরত দিতে মূল ডেটাফ্রেমের ব্যবহারটিতে ফিরে ফ্রিকোয়েন্সি যুক্ত করতে চান :

In [41]:
df['freq'] = df.groupby('a')['a'].transform('count')
df

Out[41]:

   a freq
0  a    2
1  b    3
2  s    2
3  s    2
4  b    3
5  a    2
6  b    3

[7 rows x 2 columns]

@ যোশিরিরি না, আপনি যা দেখছেন তা হ'ল এটি এমন একটি সিরিজ তৈরি করে যা মূল ডাটাফ্রেমের সাথে একত্রিত হয়, অন্যান্য পদ্ধতির তুলনায় যা অনন্য মূল্যবোধ এবং তাদের ফ্রিকোয়েন্সি প্রদর্শন করে, যদি আপনি কেবল ডেটাফ্রেমে ফ্রিকোয়েন্সি গণনা যোগ করতে চান তবে আপনি ট্রান্সফর্ম ব্যবহার করতে পারেন এই. এটি কেবলমাত্র অন্য কৌশল, আপনি লক্ষ্য করুন যে এটি ফিরিয়ে দেওয়ার পরে ডেটাফ্রেমটি ভেঙে যায়নি এবং কোনও মূল্যবোধ নেই। এছাড়াও আমি মনে করি যে ডেটাফ্রেমগুলির সর্বদা একটি সূচক থাকে বলে আমি মনে করি না আপনি এটি থেকে মুক্তি পেতে পারেন, কেবল এটি পুনরায় সেট করতে পারেন, একটি নতুন নির্ধারণ করতে পারেন বা একটি কলামকে একটি সূচক হিসাবে ব্যবহার করতে পারেন
এডচুম

4
আপনার প্রথম কোড উদাহরণে, df আশানুরূপ হিসাবে বরাদ্দ পাওয়া যায়, তবে এই লাইন: df.groupby ('a')। গণনা () একটি খালি ডেটাফ্রেম দেয়। এই উত্তরটি পান্ডাস 0.18.1 দিয়ে পুরানো বলে কি সম্ভব? এছাড়াও, এটি কিছুটা বিভ্রান্তিকর যে আপনার কলামের নাম 'এ' আপনি যে 'মান' অনুসন্ধান করছেন তার সমান as আমি নিজে এটি সম্পাদনা করব তবে যেহেতু কোডটি আমার পক্ষে কাজ করে না আমি আমার সম্পাদনাগুলি সম্পর্কে নিশ্চিত হতে পারি না।
অ্যালেক্স

1
@ অ্যালেক্স আপনি যা সঠিক বলেছেন এটি সর্বশেষতম সংস্করণগুলির মতো দেখে মনে হচ্ছে এটি আর কাজ করে না, আমার কাছে বাগের মতো মনে হচ্ছে কেন আমি তা দেখতে পাচ্ছি না
এডচাম

1
df.['a'].value_counts().reset_index()পরিবর্তে ব্যবহার করবেন না কেন df.groupby('a')['a'].transform('count')?
টমটম

1
@ আদর্শ, তারা বিভিন্ন কাজ করে, কল value_countsকরা একটি ফ্রিকোয়েন্সি গণনা তৈরি করে, যদি আপনি ফলাফলটি আপনার মূল ডিএফের বিরুদ্ধে নতুন কলাম হিসাবে যুক্ত করতে চান তবে আমার উত্তরটিতে আপনাকে transformবিস্তারিত হিসাবে ব্যবহার করতে হবে ।
এডচুম

93

আপনি যদি সমস্ত কলামে প্রয়োগ করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

df.apply(pd.value_counts)

এটি প্রতিটি কলামে কলাম ভিত্তিক একীকরণ ফাংশন (এই ক্ষেত্রে মান_কাউন্টগুলিতে) প্রয়োগ করবে।


10
এটি সবচেয়ে সহজ উত্তর। এটি শীর্ষে থাকা উচিত।
জেফ্রি জোসে

4
এই উত্তরটি কেবল সহজ তবে (আমি বিশ্বাস করি) applyকলামগুলি যেভাবে নম্পি অ্যারে ভেক্টরাইজ করেছে সেগুলি সুবিধা অপারেশনটি গ্রহণ করে না। ফলস্বরূপ, কর্মক্ষমতা বড় ডেটাসেটগুলিতে একটি সমস্যা হতে পারে।
কুয়ানব

58
df.category.value_counts()

এই সংক্ষিপ্ত সামান্য লাইন কোডটি আপনাকে আউটপুট দেবে।

যদি আপনার কলামের নাম ফাঁকা থাকে আপনি ব্যবহার করতে পারেন

df['category'].value_counts()

2
অথবা কলামের নামের স্থান থাকলে [] ব্যবহার করুন । df['category 1'].value_counts()
জ্যাকব কালকাল জোসেফ

19
df.apply(pd.value_counts).fillna(0)

মান_কাউন্ট - স্বতন্ত্র মানগুলির গণনা সম্বলিত বস্তুটি ফেরত দেয়

প্রয়োগ - প্রতিটি কলামে গণনা ফ্রিকোয়েন্সি। আপনি যদি সেট axis=1করেন তবে প্রতিটি সারিতে ফ্রিকোয়েন্সি পাবেন

ভিজেনা (0) - আউটপুটটিকে আরও অভিনব করুন। NaN 0 এ পরিবর্তিত হয়েছে


1
একই সারির জন্য কলামগুলি জুড়ে একটি মানের সংখ্যার গণনা করার সময় এটি খুব শক্তিশালী!
এএমসি

14

0.18.1 এ groupbyএকসাথে countঅনন্য মানগুলির ফ্রিকোয়েন্সি দেয় না:

>>> df
   a
0  a
1  b
2  s
3  s
4  b
5  a
6  b

>>> df.groupby('a').count()
Empty DataFrame
Columns: []
Index: [a, b, s]

যাইহোক, অনন্য মান এবং তাদের ফ্রিকোয়েন্সিগুলি সহজেই ব্যবহার করে নির্ধারিত হয় size:

>>> df.groupby('a').size()
a
a    2
b    3
s    2

সঙ্গে df.a.value_counts()সাজানো মান (নিম্নক্রম জন্য, অর্থাত বৃহত্তম প্রথম মান) ডিফল্টভাবে ফিরিয়ে আনা হয়।


এটিই একমাত্র সমাধান যা কাজ করেছিল।
saran3h


5

যদি আপনার ডেটাফ্রেমের একই ধরণের মান থাকে তবে return_counts=Trueআপনি numpy.unique () এও সেট করতে পারেন ।

index, counts = np.unique(df.values,return_counts=True)

আপনার মানগুলি পূর্ণসংখ্যা হলে np.bincount () দ্রুততর হতে পারে।


4

কোনও গ্রন্থাগার না থাকলে আপনি এটি পরিবর্তে এটি করতে পারেন:

def to_frequency_table(data):
    frequencytable = {}
    for key in data:
        if key in frequencytable:
            frequencytable[key] += 1
        else:
            frequencytable[key] = 1
    return frequencytable

উদাহরণ:

to_frequency_table([1,1,1,1,2,3,4,4])
>>> {1: 4, 2: 1, 3: 1, 4: 2}

1

আপনি প্রথমে আপনার কলামগুলি বিভাগ হিসাবে সম্প্রচারিত করে পান্ডার সাহায্যে এটি করতে পারেন, dtype="category"উদাহরণস্বরূপ

cats = ['client', 'hotel', 'currency', 'ota', 'user_country']

df[cats] = df[cats].astype('category')

এবং তারপরে ফোন করা describe:

df[cats].describe()

এটি আপনাকে মূল্য সংখ্যার একটি দুর্দান্ত টেবিল এবং আরও কিছু দেয় :):

    client  hotel   currency    ota user_country
count   852845  852845  852845  852845  852845
unique  2554    17477   132 14  219
top 2198    13202   USD Hades   US
freq    102562  8847    516500  242734  340992

0
n_values = data.income.value_counts()

প্রথম অনন্য মূল্য গণনা

n_at_most_50k = n_values[0]

দ্বিতীয় অনন্য মূল্য গণনা

n_greater_50k = n_values[1]

n_values

আউটপুট:

<=50K    34014
>50K     11208

Name: income, dtype: int64

আউটপুট:

n_greater_50k,n_at_most_50k:-
(11208, 34014)

0

@ মেটোটোস্টার ইতিমধ্যে এটি দেখিয়েছে। যাও Counter। এটি দ্রুত জ্বলছে।

import pandas as pd
from collections import Counter
import timeit
import numpy as np

df = pd.DataFrame(np.random.randint(1, 10000, (100, 2)), columns=["NumA", "NumB"])

টাইমার

%timeit -n 10000 df['NumA'].value_counts()
# 10000 loops, best of 3: 715 µs per loop

%timeit -n 10000 df['NumA'].value_counts().to_dict()
# 10000 loops, best of 3: 796 µs per loop

%timeit -n 10000 Counter(df['NumA'])
# 10000 loops, best of 3: 74 µs per loop

%timeit -n 10000 df.groupby(['NumA']).count()
# 10000 loops, best of 3: 1.29 ms per loop

চিয়ার্স!




0

আমি বিশ্বাস করি যে কোনও ডেটাফ্রেম কলামের তালিকার জন্য এটি ভাল কাজ করা উচিত।

def column_list(x):
    column_list_df = []
    for col_name in x.columns:
        y = col_name, len(x[col_name].unique())
        column_list_df.append(y)
return pd.DataFrame(column_list_df)

column_list_df.rename(columns={0: "Feature", 1: "Value_count"})

"কলাম_লিস্ট" ফাংশনটি কলামগুলির নামগুলি পরীক্ষা করে এবং তারপরে প্রতিটি কলাম মানগুলির স্বতন্ত্রতা পরীক্ষা করে।


আপনার কোডটি কীভাবে আপনার উত্তরটি উন্নত করতে কাজ করে তার একটি সংক্ষিপ্ত বিবরণ যোগ করতে পারেন।
ডব্রোমিরম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.