【问题标题】:Unordered sets as columns / Python's frozenset object无序集作为列 / Python 的 freezeset 对象
【发布时间】:2019-10-18 12:58:58
【问题描述】:

我正在尝试在 SAS 中复制以下模式(以 Python 显示):

>>> df = pd.DataFrame({'a': list('abc'), 'b': list('cba')})
>>> df
   a  b
0  a  c
1  b  b
2  c  a
>>> df['key'] = [frozenset([x, y]) for x, y in df[['a', 'b']].values]
>>> df
   a  b     key
0  a  c  (a, c)
1  b  b     (b)
2  c  a  (a, c)
>>> df.drop_duplicates('key')
   a  b     key
0  a  c  (a, c)
1  b  b     (b)

实际上,我有两列,ab。该表是通过自连接生成的,ab 代表相同的规范列。我需要在合并/连接的ab 列上删除重复项而不保留这些列中值的顺序。我可以在 Python 中使用 frozenset 无序集合非常轻松地做到这一点 - 见上文。

我认为连接列然后排序可能会起作用,但实际上我的列比单字母单元格和来自this 文章的评论要复杂得多

嗯。 “Tim Mott”和“Tom Mitt”不会以姓名形式匹配,但会以排序的字谜形式匹配。这可能很有趣。

明确表示这不是我想要做的。

关于如何在 SAS 中复制这一点的任何提示?

编辑:最终,这是我要创建的视图,基本上是按该无序键计算记录:

>>> df.groupby('key').size()
key
(a, c)    2
(b)       1
dtype: int64

【问题讨论】:

    标签: python sas


    【解决方案1】:

    如果您只是查看两个变量,则非常简单。只需先将它们与较小的值组合即可。

    data have ;
      input (var1-var2) ($);
    cards;
    a  c
    b  b
    c  a
    ;
    
    proc sql ;
    create table want as
    select
      case when var1=var2 then var1
           when var1<var2 then catx(',',var1,var2)
           else catx(',',var2,var1)
      end as key
      , count(*) as size
    from have
    group by 1
    ;
    quit;
    

    结果:

    Obs    key    size
    
     1     a,c      2
     2     b        1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-13
      • 2015-11-09
      • 2012-01-10
      • 2018-05-24
      • 2017-09-03
      • 2020-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多