无序集合作为列 / Python的frozenset对象

3

我正在尝试在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 - 如上所示。
我曾经想过连接这些列然后进行排序,但实际上我的列比单个字母单元格要复杂得多,来自文章的评论使我清楚,这不是我想做的事情。
有关如何在 SAS 中复制此操作的任何提示吗?
编辑:最终,这就是我试图创建的视图,基本上是按无序键计算记录数。
>>> df.groupby('key').size()
key
(a, c)    2
(b)       1
dtype: int64
1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接