我有一个数据集
|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())
,它会这么说
Answers:
使用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.category.value_counts()
这段简短的代码行将为您提供所需的输出。
如果列名中有空格,则可以使用
df['category'].value_counts()
df['category 1'].value_counts()
df.apply(pd.value_counts).fillna(0)
value_counts-返回包含唯一值计数的对象
适用 -计算每列中的频率。如果设置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
干杯!
your data:
|category|
cat a
cat b
cat a
解:
df['freq'] = df.groupby('category')['category'].transform('count')
df = df.drop_duplicates()
我相信这对于任何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