我有一个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是什么??
答案 0 :(得分:0)
您已经知道如何在熊猫中做到这一点,但是也可以使用pandas.Series.value_counts
方法轻松完成。正如指出的那样,糟糕的表在功能和范围上不是熊猫的复制品。他们有to_pandas
和from_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