我有这个数据框
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/