分享
三行代码  ›  专栏  ›  技术社区  ›  Ian Thompson

希望使用groupby和transform创建具有唯一值列表的列 - Want to create column with lists of unique values using groupby and transform

  •  2
  • Ian Thompson  · 技术社区  · 1 周前

    这是一个样本数据集

    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 看起来像是在用 转型 :

    预期产量

    0         [123]
    1         [456]
    2    [456, 123]
    3         [123]
    4         [456]
    5    [456, 123]
    dtype: object
    

    我知道我可以用 转型 得到 nunique 价值观 “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
    

    问题

    为什么我不能做类似的事情 独特的 转型 ?

    边注

    我知道我能做到 子句 独特的 然后 reset_index merge 有了原始数据,但我希望有一个更适合蟒蛇/熊猫的方法。

    我也试过用 set 转型 ,但返回了一个错误。

    print(test.groupby([
        'a',
        'b',
    ]).c.transform(set))
    
    TypeError: 'set' type is unordered
    
    1 回复  |  直到 1 周前
        1
  •  3
  •   Quang Hoang    1 周前

    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