【问题标题】:Unique entries in a Astropy Python tableAstropy Python 表中的唯一条目
【发布时间】:2018-12-03 17:23:22
【问题描述】:

我有一个 Astropy 表,

VHzQ_list 

它有 463 个条目,有一个名为 'na' 的列,带有

np.unique(VHzQ_list['na'])

给出 21 个条目的列表,

ATLAS
CFHQS
DELS
ELAIS 
... 
VIMOS

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

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 是什么?

【问题讨论】:

  • 我不知道size() 在这种情况下到底做了什么,因为我没有很多 Pandas 专业知识——但是 astropy Table 类,虽然与 Pandas DataFrame 有很多相似之处,不是一回事,没有理由期望它具有相同的方法和属性。可能有一种方法可以满足您的要求,但如果您更熟悉 Pandas,如果您安装了 Pandas,也可以将 Astropy Table 转换为 DataFrame。见:docs.astropy.org/en/stable/table/pandas.html

标签: python pandas dataframe unique astropy


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您已经知道如何在 pandas 中执行此操作,但也可以使用 pandas.Series.value_counts 方法轻松完成。正如所指出的,astropy 表在功能和范围上不是 pandas 的复制品。他们有to_pandasfrom_pandas 方便的方法,可以很容易地来回走动。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-26
      • 2010-12-05
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 2012-04-02
      相关资源
      最近更新 更多