在pandas数据框中像Qlik一样计算列中唯一值的数量?

258

如果我有这样一张表:

df = pd.DataFrame({
         'hID': [101, 102, 103, 101, 102, 104, 105, 101],
         'dID': [10, 11, 12, 10, 11, 10, 12, 10],
         'uID': ['James', 'Henry', 'Abe', 'James', 'Henry', 'Brian', 'Claude', 'James'],
         'mID': ['A', 'B', 'A', 'B', 'A', 'A', 'A', 'C']
})

我可以在 Qlik 中使用 count(distinct hID) 来计算唯一的 hID 的数量为 5。如何在 Python 中使用 pandas 数据帧或者 numpy 数组完成这个功能呢?类似地,如果我在 Qlik 中使用 count(hID) 将得到 8。那么在 pandas 中有什么等效的方法呢?


@piRSquared 谢谢。我可以这样做 df[['dID','hID']].agg(['count', 'size', 'nunique']),它是有效的。但是当与groupby结合时,它就不起作用了。所以 df[['dID','hID']].groupby('mID').agg(['count', 'size', 'nunique']) 报错KeyError。有没有办法选择特定的列并应用条件? - Alhpa Delta
三种方法 df[['mID', 'dID', 'hID']].groupby('mID').agg(['count', 'size', 'nunique']) - piRSquared
或者 df[['dID','hID']].groupby(df['mID']).agg(['count', 'size', 'nunique']) - piRSquared
1
或者 df.groupby('mID')[['dID', 'hID']].agg(['count', 'size', 'nunique']) - piRSquared
8个回答

395

使用nunique计算唯一值的数量:

df['hID'].nunique()
5

仅计算非空值,使用 count

df['hID'].count()
8

计算包括 null 值在内的总数,使用 size 属性:

df['hID'].size
8

编辑以添加条件

使用布尔索引:

df.loc[df['mID']=='A','hID'].agg(['nunique','count','size'])

或者使用查询

df.query('mID == "A"')['hID'].agg(['nunique','count','size'])

输出:

nunique    5
count      5
size       5
Name: hID, dtype: int64

谢谢!我们如何添加一个条件?比如对于mID='A'的nunique? - Alhpa Delta
如何计算 None 值的数量?我有一个只包含 None 的 df,而 .unique() 返回 0。 - Gulzar
1
@Gulzar 使用。像这样使用 isnadf['col'].isna().sum() - Scott Boston
如何计算不同的值,包括NaN?如果没有NaN,则意味着“count”,如果存在任何NaN,则意味着“count+1”? - Gulzar
1
要获取唯一值的计数,可以使用nunique。有一个名为“dropna”的参数,默认为True,但如果将其更改为False,则会计算唯一值并为NaN添加一个。例如,df ['val'] .nunique(dropna = False) - Scott Boston

205

如果我假设数据的名称是您的数据框的名称,您可以执行以下操作:

data['race'].value_counts()

这将显示不同元素及其出现次数。


4
如果你想了解每个独特物品的比例,你也可以这样做。data['race'].value_counts(normalize=True) - bogus

54

或者获取每列唯一值的数量:

df.nunique()

dID    3
hID    5
mID    3
uID    5
dtype: int64

pandas 0.20.0 中新增了 pd.DataFrame.agg 方法。


df.agg(['count', 'size', 'nunique'])

         dID  hID  mID  uID
count      8    8    8    8
size       8    8    8    8
nunique    3    5    3    5

groupby中,您总是可以进行agg操作。我在最后使用了stack,因为我更喜欢这种呈现方式。

df.groupby('mID').agg(['count', 'size', 'nunique']).stack()


             dID  hID  uID
mID                       
A   count      5    5    5
    size       5    5    5
    nunique    3    5    5
B   count      2    2    2
    size       2    2    2
    nunique    2    2    2
C   count      1    1    1
    size       1    1    1
    nunique    1    1    1

谢谢!我们如何添加一个条件?比如对于mID='A'的nunique? - Alhpa Delta
@AlhpaDelta,我在结尾处添加了一些内容。希望这有所帮助。 - piRSquared

10
为了去除重复行并计算唯一数量:
``` df['hID'].nunique() ```
为了知道每个唯一行内容被重复出现的次数:
``` df['hID'].value_counts() ```

8
你可以在pandas中使用 nunique
df.hID.nunique()
# 5

2

要在数据框 df 的列 hID 中计算唯一值,请使用以下代码:

len(df.hID.unique())

df.hID.nunique() 更易读。 - pfabri

1
我在寻找类似的东西时,发现了另一种可能会帮助你的方法。
  • 如果您想计算空值的数量,可以使用此函数:
def count_nulls(s):
    return s.size - s.count()

如果您想在唯一计数中包含NaN值,需要在nunique函数中传递dropna=False参数。
def unique_nan(s):
    return s.nunique(dropna=False)

以下是使用泰坦尼克数据集的所有值的总结:
from scipy.stats import mode

agg_func_custom_count = {
    'embark_town': ['count', 'nunique', 'size', unique_nan, count_nulls, set]
}
df.groupby(['deck']).agg(agg_func_custom_count)

你可以在这里找到更多信息。

-4

您可以使用len函数来使用唯一属性

len(df ['hID'] .unique()) 5


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接