Python 要使用groupby和transform创建包含唯一值列表的列吗
这是一个示例数据集Python 要使用groupby和transform创建包含唯一值列表的列吗,python,pandas,Python,Pandas,这是一个示例数据集 test = pd.DataFrame({ 'a' : [1, 2, 3]*2, 'b' : ['a', 'a', 'b', 'b', 'b', 'b',], 'c' : [123, 456, 456, 123, 456, 123] }) print(test) a b c 0 1 a 123 1 2 a 456 2 3 b 456 3 1 b 123 4 2 b 456 5 3 b 123 如果
test = pd.DataFrame({
'a' : [1, 2, 3]*2,
'b' : ['a', 'a', 'b', 'b', 'b', 'b',],
'c' : [123, 456, 456, 123, 456, 123]
})
print(test)
a b c
0 1 a 123
1 2 a 456
2 3 b 456
3 1 b 123
4 2 b 456
5 3 b 123
如果我groupby
列'a'
和'b'
,然后尝试获取每个组中唯一值('c'
)的列表,我无法使用转换获得预期结果
# using transform
print(test.groupby([
'a',
'b',
]).c.transform(pd.Series.unique))
0 123
1 456
2 456
3 123
4 456
5 123
如果我改用unique
,我几乎可以得到预期的输出:
# almost expected output
print(test.groupby([
'a',
'b',
]).c.unique())
a b
1 a [123]
b [123]
2 a [456]
b [456]
3 b [456, 123]
Name: c, dtype: object
我所希望的是一个使用transform
的pd.Series
:
预期产量
我知道我可以使用transform
来获取'c'
的nunique
值,作为一个系列来执行以下操作:
print(test.groupby([
'a',
'b',
]).c.transform(pd.Series.nunique))
0 1
1 1
2 2
3 1
4 1
5 2
Name: c, dtype: int64
问题:
为什么我不能对unique
和transform
执行类似的操作
旁注
我知道我可以做groupby
和unique
,然后reset\u index
和merge
与原始数据合并,但我希望有一种更为pythonic/pandas友好的方法
我还尝试使用set
和transform
,但返回了一个错误
print(test.groupby([
'a',
'b',
]).c.transform(set))
TypeError: 'set' type is unordered
做
为你工作
输出:
0 [123]
1 [456]
2 [456, 123]
3 [123]
4 [456]
5 [456, 123]
Name: c, dtype: object
天啊!!!我不知道'unique'
是一个可以接受的参数!非常感谢你+1.你能链接到你找到这个的文档吗?或者你知道吗?我不记得有什么医生提到过。根据我的经验,您可以转换
,应用
,agg
,使用(大多数)函数的名称,例如:平均值、总和、最小值、标准值,
。有关groupby
上的函数列表,请参阅。同样,大多数(如果不是全部的话)函数都可以通过它们的名称来调用/应用。我知道常见的函数(mean,sum,min,std,
),但不知道会列出unique
。再次非常感谢你。无法理解为什么pd.Series.unique
不能产生我想要的结果。
test.groupby(['a','b'])['c'].transform('unique')
0 [123]
1 [456]
2 [456, 123]
3 [123]
4 [456]
5 [456, 123]
Name: c, dtype: object