Astropy Python表中的唯一条目

时间:2018-12-03 17:23:22

标签: python pandas dataframe unique astropy

我有一个Astropy表

VHzQ_list 

,它长463个条目,并有一个名为“ na”的列,并带有

np.unique(VHzQ_list['na'])

给出21个条目的列表,

ATLAS
CFHQS
DELS
ELAIS 
... 
VIMOS

我想知道463个条目中有多少个是na ='ATLAS',na = CFHQS等。对于dataFrame,我会这样做:

df.groupby('na').size().sort_values(ascending=False)

但是

VHzQ_list.group_by('na').size().sort_values(ascending=False)

抛出

AttributeError: 'Table' object has no attribute 'size'

错误。相当于.size()的Astropy Table是什么??

2 个答案:

答案 0 :(得分:0)

您已经知道如何在熊猫中做到这一点,但是也可以使用pandas.Series.value_counts方法轻松完成。正如指出的那样,糟糕的表在功能和范围上不是熊猫的复制品。他们有to_pandasfrom_pandas的便捷方法,可以轻松地来回移动。

VHzQ_list.to_pandas()['na'].value_counts()

答案 1 :(得分:0)

Python的collection.Counter是在此处获得答案的简便方法:

In [1]: from astropy.table import Table                                                                                                                                                        

In [2]: from collections import Counter                                                                                                                                                        

In [3]: t = Table([['foo', 'bar', 'foo', 'bar', 'foo', 'baz']], names=['a'])                                                                                                                   

In [4]: t                                                                                                                                                                                      
Out[4]: 
<Table length=6>
 a  
str3
----
 foo
 bar
 foo
 bar
 foo
 baz

In [5]: Counter(t['a'])                                                                                                                                                                        
Out[5]: Counter({'foo': 3, 'bar': 2, 'baz': 1})

要使用Astropy做到这一点,一种方法是添加一个1的列,然后可以对其进行聚合,但这可能不如pandas灵活,因为我认为必须将聚合函数应用于所有列:

In [23]: t['b'] = 1                                                                                                                                                                            

In [24]: t                                                                                                                                                                                     
Out[24]: 
<Table length=6>
 a     b  
str3 int64
---- -----
 foo     1
 bar     1
 foo     1
 bar     1
 foo     1
 baz     1

In [25]: tg = t.group_by('a')                                                                                                                                                                  

In [26]: tg.groups.aggregate(sum)                                                                                                                                                              
Out[26]: 
<Table length=3>
 a     b  
str3 int64
---- -----
 bar     2
 baz     1
 foo     3