python - Pandas groupby - 一组不同的值

标签 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)

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

最佳答案

将 lambda 函数与 set 结合使用或 unique , 还将输出转换为 tuple小号:

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)

关于python - Pandas groupby - 一组不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47542980/

相关文章:

python - 如何在 Pandas Python 中连接不同的文本行?

python - Pandas 数据框在没有 for 循环的情况下迭代行

python - 如何使用 wxPython 将 Windows UAC Shield 覆盖在按钮上?

python - 如何使用 selenium webdriver python 中的跨度中的定位器打印文本?

python - xarray.DataArray.diff 与 pandas.DataFrame.diff 输出不同

python - Pandas:向表示日期的长整数添加 0

r - 如何删除R数据框中的列

python - "getNumPartitions"是一个昂贵的操作吗?

python - 如何在终端窗口python中创建超链接

python - 分组后计算数据框中某些值的数量