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

Posted

技术标签:

【中文标题】像 Qlik 一样计算 pandas 数据框中的列中的唯一值?【英文标题】:Counting unique values in a column in pandas dataframe like in Qlik? 【发布时间】:2018-01-27 08:03:54 【问题描述】:

如果我有这样的表:

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) 来计算 5 的唯一 HID。如何使用 pandas 数据框在 python 中做到这一点?或者也许是一个numpy数组?同样,如果要执行count(hID),我将在 Qlik 中获得 8。在 pandas 中等效的方法是什么?

【问题讨论】:

@piRSquared 谢谢。我可以做类似 df[['dID','hID']].agg(['count', 'size', 'nunique']) 之类的事情,它可以工作。但是与 groupby 结合使用时不起作用。所以 df[['dID','hID']].groupby('mID').agg(['count', 'size', 'nunique']) 说 KeyError。有没有办法选择特定的列并应用条件? 三种方式df[['mID', 'dID','hID']].groupby('mID').agg(['count', 'size', 'nunique']) df[['dID','hID']].groupby(df['mID']).agg(['count', 'size', 'nunique']) df.groupby('mID')[['dID', 'hID']].agg(['count', 'size', 'nunique']) 【参考方案1】:

对于没有重复的行的唯一计数

df['hID'].nunique()

要知道每个唯一行内容重复的数量

df['hID'].value_counts()

【讨论】:

【参考方案2】:

我正在寻找类似的东西,我找到了另一种可以帮助你的方法

如果你想统计空值的个数,你可以使用这个函数:
def count_nulls(s):
    return s.size - s.count()
如果您想在唯一计数中包含 NaN 值,则需要将 dropna=False 传递给 nunique 函数。
def unique_nan(s):
    return s.nunique(dropna=False)
以下是使用 titanic 数据集汇总的所有值:
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)

您可以找到更多信息Here

【讨论】:

【参考方案3】:

计算不同的值,使用nunique

df['hID'].nunique()
5

只计算非空值,使用count

df['hID'].count()
8

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

df['hID'].size
8

编辑以添加条件

使用布尔索引:

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

或使用query

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

输出:

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

【讨论】:

谢谢!我们如何添加条件?像 mID='A' 的 nunique 吗? 如何计算 None 值的数量?我的 df 只有 None,.unique() 返回 0 @Gulzar 使用。 isna 喜欢这个 df['col'].isna().sum() 如何计算不同的值,包括 nans?意思是count如果没有nans,或者count+1如果存在任何nan? @Gulzar 要获取不同值的计数,请使用 nunique。有一个参数dropna 默认为 True,但如果将其更改为 False,它将计算不同的值并为 NaN 添加一个。例如,df['val'].nunique(dropna=False)【参考方案4】:

要计算列中的唯一值,例如数据框 dfhID,请使用:

len(df.hID.unique())

【讨论】:

df.hID.nunique() 更具可读性。【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

df.nunique()

dID    3
hID    5
mID    3
uID    5
dtype: int64

pandas 0.20.0pd.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 吗? @AlhpaDelta 我在最后添加了一些东西。希望有帮助【参考方案7】:

如果我假设 data 是您的数据框的名称,您可以这样做:

data['race'].value_counts()

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

【讨论】:

如果您想要每个独特项目的比例,您也可以这样做。 data['race'].value_counts(normalize=True)【参考方案8】:

你可以在 pandas 中使用nunique

df.hID.nunique()
# 5

【讨论】:

以上是关于像 Qlik 一样计算 pandas 数据框中的列中的唯一值?的主要内容,如果未能解决你的问题,请参考以下文章

在计算 Pandas 创建的数据框中的列的平均值时指定“跳过 NA”

将数组和元组元素转换为 Pandas 数据框中的列 [重复]

如何从python中的pandas数据框中的列中提取关键字(字符串)

像在 Qlik 中一样在 Pandas 中做 Crosstable?

Python pandas:在我的数据框中添加一个计算变量的列

如何检索 Pandas 数据框中的列数?