繁体   English   中英

无序集作为列/Python的frozenset object

[英]Unordered sets as columns / Python's frozenset object

我正在尝试在 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无序集合集合 - 见上文。

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

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

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

有关如何在 SAS 中复制此内容的任何提示?

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

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

如果你只看两个变量,那很简单。 只需先将它们与较小的值结合起来。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM