像 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】:
要计算列中的唯一值,例如数据框 df
的 hID
,请使用:
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.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 吗? @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?