Астропия таблицы манипуляций: Как я могу создать новую таблицу со строками, сгруппированными по значениям в столбце? - PullRequest
0 голосов
/ 02 июня 2018

У меня есть таблица с несколькими строками и столбцами.Один из столбцов имеет разные номера, которые повторяются несколько раз.Как я могу создать новую таблицу астропии, в которой хранятся только строки со столбцом, который повторяет число, скажем, более чем в 3 раза?

пример:

таблица

enter image description here

Обратите внимание, что 0129 повторяется 3 раза в столбце c, 2780 повторяется 4 раза в столбце c.Я хотел бы, чтобы мой код создал новую таблицу:

измененная таблица

enter image description here

Я использую модуль астропии ив частности:

from astropy.table import Table

Я предполагаю, что мне нужно использовать цикл for для выполнения этой задачи и, в конечном итоге, команду

new_table.add_row(table[index]) 

Общая картина, что я пытаюсь сделать так:

if column_c_value repeats >=3:
    new_table.add_row(table[index])

Спасибо за помощь!Я застрял здесь и был бы очень признателен.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Я предлагаю решение, которое использует менее изящные инструменты, чем @ TomAldcroft's решение, и фактически отфильтровывает короткие группы.Предположим, что столбец с повторяющимися элементами называется 'id', как в @ 1005 * решении TomAldcroft.Тогда

from collections import Counter
import numpy as np
min_repeats = 3 # Let's say selected rows must have 'id' repeated at least 3 times

cntr = Counter(t['id'])
repeated_elements = [k for k, v in cntr.items() if v >= min_repeats]
mask = np.in1d(t['id'], repeated_elements)
new_table = t[mask]
0 голосов
/ 02 июня 2018

Вы можете использовать функциональность Таблица группировки :

In [2]: t = Table([[1, 2, 3, 4, 5, 6, 7, 8],
   ...:            [10, 11, 10, 10, 11, 12, 13, 12]],
   ...:            names=['a', 'id'])

In [3]: tg = t.group_by('id')

In [4]: tg.groups
Out[4]: <TableGroups indices=[0 3 5 7 8]>

In [6]: tg.groups.keys
Out[6]: 
<Table length=4>
  id 
int64
-----
   10
   11
   12
   13

In [7]: np.diff(tg.groups.indices)
Out[7]: array([3, 2, 2, 1])

In [8]: tg
Out[8]: 
<Table length=8>
  a     id 
int64 int64
----- -----
    1    10
    3    10
    4    10
    2    11
    5    11
    6    12
    8    12
    7    13

In [9]: ok = np.zeros(len(tg), dtype=bool)

In [10]: for i0, i1 in zip(tg.groups.indices[:-1], tg.groups.indices[1:]):
    ...:     if (i1 - i0) >= 3:
    ...:         ok[i0:i1] = True
    ...: tg3 = tg[ok]
    ...: tg3
    ...: 
Out[10]: 
<Table length=3>
  a     id 
int64 int64
----- -----
    1    10
    3    10
    4    10

In [12]: for tgg in tg.groups:
    ...:     if len(tgg) >= 2:
    ...:         print(tgg)  # or do something with it
    ...:         
 a   id
--- ---
  1  10
  3  10
  4  10
 a   id
--- ---
  2  11
  5  11
 a   id
--- ---
  6  12
  8  12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...