データセットがあります
|category|
cat a
cat b
cat a
(一意の値と頻度を示す)などを返すことができるようにしたい
category | freq |
cat a 2
cat b 1
type(df['category'].value_counts())
、そう言うでしょう
データセットがあります
|category|
cat a
cat b
cat a
(一意の値と頻度を示す)などを返すことができるようにしたい
category | freq |
cat a 2
cat b 1
type(df['category'].value_counts())
、そう言うでしょう
回答:
使用する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]
df.['a'].value_counts().reset_index()
代わりに使用しないのはなぜdf.groupby('a')['a'].transform('count')
ですか?
value_counts
は頻度カウントを生成します、もしあなたがあなたの元のdfに対して新しい列として結果を追加したいなら、あなたtransform
は私の答えで詳述されているように使わなければなりません。
すべての列に適用したい場合は、以下を使用できます。
df.apply(pd.value_counts)
これにより、列ベースの集計関数(この場合はvalue_counts)が各列に適用されます。
apply
操作は列が提供するようにNumpy配列をベクトル化する利点を活用していません。その結果、大規模なデータセットではパフォーマンスが問題になる可能性があります。
df.category.value_counts()
この短いコード行により、必要な出力が得られます。
列名にスペースが含まれている場合、使用できます
df['category'].value_counts()
df['category 1'].value_counts()
df.apply(pd.value_counts).fillna(0)
value_counts-一意の値の数を含むオブジェクトを返します
apply-すべての列の頻度をカウントします。を設定するとaxis=1
、すべての行に頻度が表示されます
fillna(0)-出力をより豪華にします。NaNを0に変更
dfの複数の列にリスト内包表記とvalue_countsを使用する
[my_series[c].value_counts() for c in list(my_series.select_dtypes(include=['O']).columns)]
DataFrameに同じタイプの値がある場合はreturn_counts=True
、numpy.unique()でも設定できます。
index, counts = np.unique(df.values,return_counts=True)
値が整数の場合、np.bincount()はより高速になる可能性があります。
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
@metatoasterはすでにこれを指摘しています。に行く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
乾杯!
これは、どのDataFrame列リストでも問題なく機能するはずです。
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"})
関数 "column_list"は列名をチェックしてから、各列値の一意性をチェックします。
collections.Counter