【问题标题】:Pandas `transform(set)` raising exceptionPandas `transform(set)` 引发异常
【发布时间】:2020-05-16 07:47:29
【问题描述】:

我正在尝试通过set 进行转换,但遇到了异常。 Transform 适用于“sum”和许多其他聚合函数,但不适用于 setlist

>>> import pandas as pd
>>> df = pd.DataFrame({"a":[1,2,1,], "b":[1,1,2]})
>>> df
   a  b
0  1  1
1  2  1
2  1  2
>>> df.groupby("a").b.transform(set)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/avloss/conda/lib/python3.7/site-packages/pandas/core/groupby/generic.py", line 1032, in transform
    s = klass(res, indexer)
  File "/Users/avloss/conda/lib/python3.7/site-packages/pandas/core/series.py", line 282, in __init__
    "{0!r} type is unordered" "".format(data.__class__.__name__)
TypeError: 'set' type is unordered

我所期待的是:

   a      b   
0  1  {1, 2}
1  2     {1}
2  1  {1, 2}

【问题讨论】:

    标签: python pandas dataframe set transform


    【解决方案1】:

    我们有unique,注意unique 甚至会保留您输入的原始顺序

    df.groupby('a').b.transform('unique')
    0    [1, 2]
    1       [1]
    2    [1, 2]
    Name: b, dtype: object
    

    如果以上不起作用,请更新 , 试试下面

    df.groupby('a').b.transform(lambda x : [set(x)]*len(x))
    0    {1, 2}
    1       {1}
    2    {1, 2}
    Name: b, dtype: object
    

    【讨论】:

    • 不幸的是,这似乎不再起作用了,至少从 pandas 1.0.1 开始:github.com/pandas-dev/pandas/issues/31849
    • @geo909 解决df.groupby('a').b.transform(lambda x : [set(x)]*len(x)) 0 {1, 2} 1 {1} 2 {1, 2} Name: b, dtype: object 的其他一些工作
    【解决方案2】:

    我能想到的最简单的方法是将aggregate 设置为set 并将其映射回来

    df['new_col'] = df['a'].map(df.groupby('a')['b'].agg(set))
    print(df)
    

       a  b new_col
    0  1  1  {1, 2}
    1  2  1     {1}
    2  1  2  {1, 2}
    

    【讨论】:

      猜你喜欢
      • 2014-02-27
      • 1970-01-01
      • 2012-09-11
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多