如何找出pandas groupby对象中的唯一行数?

时间:2016-09-22 18:47:23

标签: python pandas dataframe group-by

我知道我们可以在groupby列上使用.nunique()来查找列中的唯一元素数,如下所示:

df = pd.DataFrame({'c1':['foo', 'bar', 'foo', 'foo'], 'c2': ['A', 'B', 'A', 'B'], 'c3':[1, 2, 1, 1]})

    c1 c2  c3
0  foo  A   1
1  bar  B   2
2  foo  A   1
3  foo  B   1

df.groupby('c1')['c2'].nunique()

c1
bar    1
foo    2
Name: c2, dtype: int64

但是,现在我有一个包含多个列的groupby对象,有没有办法找出唯一行的数量?

df.groupby('c1')['c2', 'c3'].???

更新: 因此,我想要的最终结果是每个组中基于' c1'列,例如:

foo 2
bar 1

更新2: 这是一个新的测试数据框:

df = pd.DataFrame({'c1': ['foo', 'bar', 'foo', 'foo', 'bar'], 'c2': ['A'
, 'B', 'A', 'B', 'A'], 'c3': [1, 2, 1, 1, 1]})

3 个答案:

答案 0 :(得分:1)

<强>更新

In [131]: df.groupby(['c1','c2','c3']).size().rename('count').reset_index()[['c1','count']].drop_duplicates(subset=['c1'])
Out[131]:
    c1  count
0  bar      1
1  foo      2

OLD回答:

IIYC你需要这个:

In [43]: df.groupby(['c1','c2','c3']).size()
Out[43]:
c1   c2  c3
bar  B   2     1
foo  A   1     2
     B   1     1
dtype: int64

答案 1 :(得分:0)

如果需要nunique标题列c2c3,则更容易使用:

df['c'] = df.c2 + df.c3.astype(str)
print (df.groupby('c1')['c'].nunique())
c1
bar    1
foo    2
Name: c, dtype: int64      

groupby Series cdf.c1c = df.c2.astype(str) + df.c3.astype(str) print (c.groupby([df.c1]).nunique()) c1 bar 2 foo 2 dtype: int64

    TIMESTAMP_A=1472680800
    TIMESTAMP_B=1458687600

    if [[ ${TIMESTAMP_A} -lt ${TIMESTAMP_B} ]]; then
            echo "Timestamp A is younger!";
    else
            echo "Timestamp B is younger!";
    fi

答案 2 :(得分:0)

最后想出了如何做到这一点!

import pandas as pd
import numpy as np

df = pd.DataFrame({'c1': ['foo', 'bar', 'foo', 'foo', 'bar'],
                   'c2': ['A', 'B', 'A', 'B', 'A'],
                   'c3': [1, 2, 1, 1, 1]})

def check_unique(df):
    return len(df.groupby(list(df.columns.values)))

print(df.groupby('c1').apply(check_unique))