我有这个数据框
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)
这是包含更多列的更大数据框的一部分,每个列都有自己的聚合函数,那么如何将此功能传递给聚合字典呢?
答案 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函数与set
或unique
一起使用,同时将输出转换为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)