这是示例数据集
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'
)列表,那么我没有得到预期的结果使用transform
# 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
我想要的是一个pd.Series
,使用transform
看起来像这样:
0 [123]
1 [456]
2 [456, 123]
3 [123]
4 [456]
5 [456, 123]
dtype: object
我知道我可以使用transform
来获得nunique
的{{1}}值,作为一系列的操作:
'c'
为什么我不能对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_index
的操作,但是我希望可以使用更多的pythonic / pandas友好的方法。
我也尝试使用merge
和set
,但是返回了错误。
transform
答案 0 :(得分:3)
是
d = {'CaseID': [ID1, ID2,ID3,ID4], 'Open Date': [Jan-1, Mar-8, Apr-10,Aug-6], 'Close Date':[Apr-9,Apr-9,Dec-12,Dec-12]}
为您工作?
输出:
test.groupby(['a','b'])['c'].transform('unique')