像 Qlik 一样计算 pandas 数据框中列中的唯一值?
Counting unique values in a column in pandas dataframe like in Qlik?
如果我有这样的table:
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。我如何使用 pandas 数据框在 python 中做到这一点?或者也许是一个 numpy 数组?同样,如果要执行 count(hID)
我将在 Qlik 中得到 8。 pandas 中的等效方法是什么?
您可以在 pandas 中使用 nunique
:
df.hID.nunique()
# 5
计算不同的值,使用 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
或获取每列的唯一值的数量:
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
如果我假设数据是您的数据框的名称,您可以这样做:
data['race'].value_counts()
这将向您显示不同的元素及其出现次数。
您可以使用 len 函数
来使用唯一性 属性
len(df['hID'].unique())
5
要计算列中的唯一值,比如数据框 df
的 hID
,请使用:
len(df.hID.unique())
我一直在寻找类似的东西,但我找到了另一种可以帮助你的方法
- 如果你想统计空值的个数,你可以使用这个函数:
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
对于没有重复的行的唯一计数
df['hID'].nunique()
要知道每个唯一行内容重复的数量
df['hID'].value_counts()
如果我有这样的table:
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。我如何使用 pandas 数据框在 python 中做到这一点?或者也许是一个 numpy 数组?同样,如果要执行 count(hID)
我将在 Qlik 中得到 8。 pandas 中的等效方法是什么?
您可以在 pandas 中使用 nunique
:
df.hID.nunique()
# 5
计算不同的值,使用 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
或获取每列的唯一值的数量:
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
如果我假设数据是您的数据框的名称,您可以这样做:
data['race'].value_counts()
这将向您显示不同的元素及其出现次数。
您可以使用 len 函数
来使用唯一性 属性len(df['hID'].unique()) 5
要计算列中的唯一值,比如数据框 df
的 hID
,请使用:
len(df.hID.unique())
我一直在寻找类似的东西,但我找到了另一种可以帮助你的方法
- 如果你想统计空值的个数,你可以使用这个函数:
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
对于没有重复的行的唯一计数
df['hID'].nunique()
要知道每个唯一行内容重复的数量
df['hID'].value_counts()