想要使用groupby和transform创建包含唯一值列表的列

时间:2019-09-10 20:16:38

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

如果我在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做类似的事情?

旁注

我知道我可以对原始数据进行transformgroupby然后uniquereset_index的操作,但是我希望可以使用更多的pythonic / pandas友好的方法。

我也尝试使用mergeset,但是返回了错误。

transform

1 个答案:

答案 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')