Pandas groupby - 一组不同的值

时间:2017-11-29 00:05:31

标签: python pandas dataframe pandas-groupby

我有这个数据框

x = pd.DataFrame.from_dict({'cat1':['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'], 'cat2':['X', 'X', 'Y', 'Y', 'Y', 'Y', 'Z', 'Z']})

  cat1 cat2
0    A    X
1    A    X
2    A    Y
3    B    Y
4    B    Y
5    C    Y
6    C    Z
7    C    Z

我希望按cat1进行分组,然后将cat2汇总为不同值的集合,例如

  cat1 cat2
0    A    (X, Y)
1    B    (Y,)
2    C    (Y, Z)

这是包含更多列的更大数据框的一部分,每个列都有自己的聚合函数,那么如何将此功能传递给聚合字典呢?

5 个答案:

答案 0 :(得分:3)

x.groupby('cat1')['cat2'].unique().reset_index()

# Returns 
  cat1    cat2
0    A  [X, Y]
1    B     [Y]
2    C  [Y, Z]

首先将整个数据框分组为“cat1'”,仅选择系列' cat2',并将每个组缩减为唯一的“cat2'”组合。值。结果就是“cat1'索引中的值,因此reset_index()会将这些值作为列提取出来,如果您需要该格式。

答案 1 :(得分:3)

将lambda函数与setunique一起使用,同时将输出转换为tuple s:

x = pd.DataFrame.from_dict({'cat1':['A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'], 
                            'cat2':['X', 'X', 'Y', 'Y', 'Y', 'Y', 'Z', 'Z'],
                             'col':range(8)})
print (x)
  cat1 cat2  col
0    A    X    0
1    A    X    1
2    A    Y    2
3    B    Y    3
4    B    Y    4
5    C    Y    5
6    C    Z    6
7    C    Z    7

a = x.groupby('cat1').agg({'cat2': lambda x: tuple(set(x)), 'col':'sum'})
print (a)
        cat2  col
cat1             
A     (Y, X)    3
B       (Y,)    7
C     (Y, Z)   18

或者:

a = x.groupby('cat1').agg({'cat2': lambda x: tuple(x.unique()), 'col':'sum'})
print (a)
        cat2  col
cat1             
A     (X, Y)    3
B       (Y,)    7
C     (Y, Z)   18

编辑:

f = lambda x: tuple(x.unique())
f.__name__ = 'my_name'
a = x.groupby('cat1')['cat2'].agg(['min', 'max', 'nunique', f])
print (a)
     min max  nunique my_name
cat1                         
A      X   Y        2  (X, Y)
B      Y   Y        1    (Y,)
C      Y   Z        2  (Y, Z)

如果列名lambda只有一个<lambda>功能或没有问题:

a = x.groupby('cat1')['cat2'].agg(['min', 'max', 'nunique', lambda x: tuple(x.unique())])
print (a)
     min max  nunique <lambda>
cat1                          
A      X   Y        2   (X, Y)
B      Y   Y        1     (Y,)
C      Y   Z        2   (Y, Z)

答案 2 :(得分:2)

Groupby和unique为您提供了独特的价值

x.groupby('cat1').cat2.unique()

A    [X, Y]
B       [Y]
C    [Y, Z]

如果你想在元组中输出,请尝试

x.groupby('cat1').cat2.unique().apply(tuple)

A    (X, Y)
B      (Y,)
C    (Y, Z)

答案 3 :(得分:2)

或者我们可以在groupby之前过滤数据帧

x.drop_duplicates().groupby('cat1').cat2.apply(tuple)
Out[777]: 
cat1
A    (X, Y)
B      (Y,)
C    (Y, Z)
Name: cat2, dtype: object

答案 4 :(得分:1)

x.groupby('cat1').agg(lambda x: set(x))

<强>输出

enter image description here